2012-07-14 17 views
6

Mam podklasa JFrame, korzystającej z klasy z rozszerzoną JPanelJPanel nie ma odpowiedzi na KeyListener imprezy

public class HelloWorld extends JPanel implements KeyListener 

mogę dodać obiekt HelloWorld do ramy - app.add(helloWorld);. Teraz, gdy naciskam dowolny klawisz klawiatury, inny niż KeyListener, wywoływane są metody i wygląda na to, że helloWorld nie ma fokusa okna. Próbowałem również wywołać helloWorld.requestFocusInWindow();, ale nadal nie odpowiada.

W jaki sposób mogę odpowiedzieć na kluczowe naciśnięcie?

+1

zajrzeć do [kluczowych powiązań] (http://docs.oracle.com/javase /tutorial/uiswing/misc/keybinding.html). Może lub nie może rozwiązać problemu, ale ogólnie lepsze podejście do Swinga. –

Odpowiedz

11

Czy ustawiłeś, że KeyListener dla panelu HelloWorld będzie tym samym panelem? Prawdopodobnie również musisz ustawić ten panel, aby można było ustawić jego ostrość. Testowałem go przez ten kod i wydaje się działać tak jak powinien

class HelloWorld extends JPanel implements KeyListener{ 
    public void keyTyped(KeyEvent e) { 
     System.out.println("keyTyped: "+e); 
    } 
    public void keyPressed(KeyEvent e) { 
     System.out.println("keyPressed: "+e); 
    } 
    public void keyReleased(KeyEvent e) { 
     System.out.println("keyReleased: "+e); 
    } 
} 

class MyFrame extends JFrame { 
    public MyFrame() { 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setSize(200,200); 

     HelloWorld helloWorld=new HelloWorld(); 

     helloWorld.addKeyListener(helloWorld); 
     helloWorld.setFocusable(true); 

     add(helloWorld); 
     setVisible(true); 
    } 
    public static void main(String[] args) { 
     new MyFrame(); 
    } 
} 
+0

Nie zapomnij o 'grabFocus()' jeśli masz niestandardowe mouselistenery –

8

JPanel domyślnie nie można ustawiać. Oznacza to, że nie może odpowiadać na zdarzenia związane z fokusem, co oznacza, że ​​nie może reagować na kluczowe zdarzenia.

Sugerowałbym próbę ustawiania dla opcji SetFocusable na panelu na true i próbę ponownie. Pamiętaj, aby najpierw kliknąć panel, aby upewnić się, że jest aktywny.

Zrozum, W PRZYSZŁOŚCI uzyskasz dziwne problemy z przesunięciem ostrości, ponieważ panel przejrzy ogniskową, gdy użytkownik przejdzie przez twoje formularze, sprawiając wrażenie, że ostrość została utracona w niektórych miejscach.

Są również nierzetelne w tego rodzaju sytuacjach (ze względu na sposób działania menedżera ostrości).

0

prosty trzeba dodać

addKeylistener(new HelloWorld());