2012-07-14 9 views
6

ho una sottoclasse di JFrame che utilizza una classe estesa da JPanelJPanel non lo fa risposta a KeyListener evento

public class HelloWorld extends JPanel implements KeyListener 

aggiungo un oggetto di HelloWorld al telaio - app.add(helloWorld);. Ora, quando preme un qualsiasi tasto della tastiera, non viene chiamato il metodo KeyListener e sembra che lo helloWorld non abbia il focus sulla finestra. Ho provato anche a invocare helloWorld.requestFocusInWindow(); ma ancora non risponde.

Come posso rispondere alla pressione dei tasti?

+1

Guardare in [combinazioni di tasti] (http://docs.oracle.com/javase /tutorial/uiswing/misc/keybinding.html). Può o non può risolvere il problema, ma un approccio generalmente migliore per Swing. –

risposta

11

Avete impostato che KeyListener per il pannello HelloWorld sarebbe il pannello stesso? Probabilmente avrai anche bisogno di impostare quel pannello come focusable. L'ho provato da questo codice e sembra funzionare come dovrebbe

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

non dimenticare di 'grabFocus()' se hai dei mouselisteners personalizzati –

8

JPanel non è attivo per impostazione predefinita. Cioè, non può rispondere agli eventi relativi alla messa a fuoco, il che significa che non può rispondere agli eventi chiave.

Suggerisco di provare a impostareFocusable sul pannello su true e riprovare. Assicurati di fare prima clic sul pannello per assicurarti che riceva il focus.

Capire però, si otterranno strani problemi di attraversamento del focus, poiché il pannello riceverà ora il focus di input mentre l'utente naviga attraverso i moduli, facendo sembrare che il focus sia stato perso in qualche punto.

Inoltre, KeyListener s tendono ad essere inaffidabili in questo tipo di situazione (a causa del modo in cui il gestore di messa a fuoco funziona).

0

semplice si deve aggiungere

addKeylistener(new HelloWorld()); 
Problemi correlati