Witam na kursie z którego uczę się javy wszystkie aplikacje okienkowe były pisane w trzech klasach
- Test
- Frame
- Panel
a gdy doszedłem do obsługi zdarzeń z klawiatury to był już napisany w dwóch klasach bez panelu. W ramach nauki postanowiłem przerobić ten panel najpierw żeby po wciśnięciu byle jakiego klawisza przycisk się aktywował i tu mam problem ponieważ klasa MyPanel nie nadsłuchuje co się dzieje wyczytałem że muszę ustawić fokus w klasie panelu gdy to zrobię to działa bez problemu ale pytanie dlaczego do KeyListener muszę ustawić setFocusable a do ActionListener już nie? Poniżej kod programu - Test
import java.awt.EventQueue;
public class Test {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new MyFrame();
}
});
}
}
- MyFrame
import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MyFrame extends JFrame{
public MyFrame(){
super ("Klawiatura");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel=new MyPanel();
add(panel);
setLocation(800,400);
setPreferredSize(new Dimension (400,200));
pack();
setVisible (true);
}
}
- MyPanel
import java.awt.FlowLayout;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JButton;
import javax.swing.JPanel;
public class MyPanel extends JPanel implements KeyListener{
JButton przycisk=new JButton ("Przycisk");
public MyPanel(){
add(przycisk);
setLayout(new FlowLayout());
addKeyListener(this);
// i jak tu napiszę setFocusable(true); to działa bez problemu
przycisk.setEnabled(false);
}
@Override
public void keyPressed(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent arg0) {
przycisk.setEnabled(true);
}
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
}
Z góry bardzo dziękuję za wytłumaczenie :)