2012-07-14 19 views
6

tengo una subclase de JFrame que utiliza una clase extendida desde JPanelJPanel no tiene respuesta a KeyListener caso

public class HelloWorld extends JPanel implements KeyListener 

agrego un objeto de HelloWorld al marco - app.add(helloWorld);. Ahora, cuando presiono cualquier tecla del teclado, no se llama a los métodos KeyListener y parece que helloWorld no tiene foco de ventana. Intenté también invocar helloWorld.requestFocusInWindow(); pero todavía no responde.

¿Cómo puedo hacer que responda al presionar la tecla?

+1

Mira en [asociaciones de teclas] (http://docs.oracle.com/javase /tutorial/uiswing/misc/keybinding.html). Puede o no resolver el problema, pero un enfoque generalmente mejor para Swing. –

Respuesta

11

¿Ha establecido que KeyListener para su panel HelloWorld sería ese panel? También es probable que necesite establecer ese panel enfocable. Lo he comprobado por este código y parece que funciona como debería

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

no te olvides de 'grabFocus()' si tienes servidores personalizados –

8

JPanel no se puede enfocar por defecto. Es decir, no puede responder a los eventos relacionados con el enfoque, lo que significa que no puede responder a los eventos keyevents.

Sugeriría que trate de ponerFocusable en el panel en verdadero e intentar de nuevo. Asegúrese de hacer clic primero en el panel para asegurarse de que reciba el foco.

Sin embargo, SE PRODUCIRÁ problemas extraños en el enfoque transversal, ya que el panel recibirá el enfoque de entrada mientras el usuario navega por sus formularios, haciendo que parezca que el foco se ha perdido en alguna parte.

Además, KeyListener s tienden a ser poco fiables en este tipo de situación (debido a la forma en que funciona el administrador de enfoque).

0

sencilla hay que añadir

addKeylistener(new HelloWorld());