KeyListener w Panelu nie działa

0

Witam na kursie z którego uczę się javy wszystkie aplikacje okienkowe były pisane w trzech klasach

  1. Test
  2. Frame
  3. 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
  4. Test
import java.awt.EventQueue;

public class Test {
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new MyFrame();
            }
        });
    }
} 
  1. 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);
	}
}
  1. 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 :)

0

dzieje się tak zapewne dlatego, że interface KeyListener implementujesz w JPanelu, który z kolei dodajesz do JFrame, który nie nasłuchuje, ale jeśli ustawisz fokus na ten swój JPanel, który nasłuchuje :P to działa. Tak mi się wydaje, ale nie jestem pewien. Łatwo to sprawdzisz jeśli dodasz implementacje KeyListener do JFrame i sprawdzisz bez focusa :)

0

Zgadza się jeśli pominę klasę Panel i to wszystko umieszczę w klasie Frame to działa bez problemu tylko nie wiem czemu KeyListener wymaga fokusa na Panelu a gdy ActionListener implementuję w panelu (do przycisku) który dodaję do Frame to nie wymaga fokusa?

0

Pokaż kod z implementacją ActionListenera

1

coś bym napisał ale zaraz Shalom wpadnie i mnie zruga :D

to może być podpowiedź: http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

inaczej reaguje JPanel, który dziedziczy po JComponent, a inaczej JFrame, który JComponent nie jest i dziedziczy po Frame

1 użytkowników online, w tym zalogowanych: 0, gości: 1