Tengo un JPanel dentro de un JFrame. He registrado un KeyListener, basado en que quiero actualizar el JPanel. El problema que estoy teniendo es que no puedo conseguir el enfoque en la JPanel y por lo tanto mi KeyListener no funciona. Ya sé que el KeyListener es funcional porque me he registrado con el JFrame y funcionó bien. Mi código es algo como esto en el momento:

myFrame.setFocusable(false);
myPanel.setFocusable(true);
myPanel.addKeyListener(myKL);
myFrame.add(myPanel);

Alguien ha encontrado un problema como este antes? Hay algo que me falta en lo que respecta a este?

P. S.: no tengo ninguno de los componentes dentro de la JPanel acabo de dibujar una Imagen en el fondo, por lo que necesito que sea el foco de atención en el JPanel en sí y no en algo en su interior.

  • Hmm, con la adición de myPanel.requestFocus() esto funciona para mí. Qué versión de Java que está en ejecución?
  • Tal vez publicar un SSCCE(simple autónomo compilable ejemplo) que reproduce este. Que va a dar a los demás algo de trabajo w/ a de ayuda. También he avisos w/ un problema por el estrechamiento hacia el ámbito más pequeño, a veces soy capaz de encontrar la solución a mí mismo.
InformationsquelleAutor Vlad T. | 2010-01-25

5 Comentarios

  1. 22

    Aunque se indica que el panel puede ser seleccionable, el panel no está pidiendo el foco. Trate de usar myPanel.requestFocus();.

    • Gracias por tu respuesta. Trató de ambos requestFocus() y requestFocusInWindow(), ninguno de ellos hacer el Panel de obtener el foco. ¿Tienes alguna otra sugerencia?
    • Todo depende de cuando te llaman. No lo llame en el JPanel del constructor, por ejemplo, desde que se llama antes de que el panel se muestra.
    • Gracias David, esta respuesta trabajó para mí, yo no tenía idea de que yo podía hacer la llamada al constructor. Tan pronto como me mudé a la requestFocus() a un método que estaba recibiendo llamadas después de la visualización en la pantalla funcionaba perfectamente.
  2. 6

    Uso setFocusable(true) y, a continuación,requestFocusInWindow(). Pero el último debe hacerse después de la ventana que contiene el panel se hace visible, por lo que es probable que necesite para registrar una ventana oyente y hacer el requestFocusInWindow() en la ventana activa el código del controlador.

    Nota: Específicamente después de la ventana de es visible, no sólo después de llamar a setVisible(true).

    • Entonces, ¿cómo puede mi código de decir cuando la ventana de es visible, si espera hasta después de setVisible(true) se llama, es insuficiente?
  3. 2

    Intentar

    panel.setFocusable(true);
    panel.setRequestFocusEnabled(true);
    
    //some code here
    
    panel.grabFocus();
  4. 1

    Yo a veces se enfrentan a un problema similar. He notado que en algunos casos es mejor hacer o solicitar el foco en un control específico dentro del panel que está dentro de la trama (por ejemplo, el cuadro de entrada a la que desea que la entrada de teclado para ir), en lugar de solicitar el enfoque para el panel de sí mismo.

    • totalmente de acuerdo.
  5. 1

    Intentar algo como esto:

        myFrame.addFocusListener(new FocusAdapter() {
    
            /**
             * {@inheritDoc}
             */
            @Override
            public void focusGained(FocusEvent aE) {
                myPanel.requestFocusInWindow();
            }
        });

Dejar respuesta

Please enter your comment!
Please enter your name here