Pregunta

Por lo tanto, quiero activar un evento (pausar / pausar algunos medios) cada vez que el usuario presiona la barra espaciadora en cualquier lugar de mi aplicación Swing.

Dado que hay tantos controles y paneles que podrían tener foco, no es realmente posible agregar eventos clave a todos ellos (por no mencionar asqueroso).

Entonces encontré

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()

lo cual es increíble, puedes registrar pre-manejadores de pulsaciones de teclas globales. Sin embargo, hay un problema importante: los espacios se escribirán todo el tiempo en campos de entrada, celdas de tabla, etc. ¡Y obviamente no quiero activar el evento de pausa!

Entonces, ¿alguna idea? ¿Quizás haya una manera de detectar globalmente si el cursor está enfocado en algo que permite el ingreso de texto, sin tener que revisar una lista de todos los controles editables (vomito)?

¿Fue útil?

Solución

Creo que usted mismo respondió eso: sí, creo que puede averiguar el elemento actual que tiene foco, y si es una instancia de una determinada clase de campo, ignora el espacio con el propósito de pausar el evento. Si parece pesado, no te preocupes, la instancia de es MUY rápida para la JVM (y en cualquier caso estás hablando de eventos a escala humana que son un eón para un procesador).

Otros consejos

Estoy oxidado en mi Swing, pero creo que deberías intentar registrar un oyente global usando Toolkit.addAWTEventListener con un KEY_EVENT_MASK . Luego puede filtrar el procesamiento de AWTEvent en función de su tipo y origen.

Ok ... Bueno, estoy tratando de filtrar según la fuente. El problema es mi ComboBoxes editables ... Son instancia de

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField

Y dado que BorderlessTextField es una clase interna privada, aparentemente no puedo hacer una instancia de verificación en su contra.

ideas?

EDITAR: ok entonces esto funciona ...

 KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventPostProcessor(new KeyEventPostProcessor() {

            public boolean postProcessKeyEvent(KeyEvent e) {
                if (e.getID() == KeyEvent.KEY_PRESSED) {
                    Object s = e.getComponent();
                    if (!(s instanceof JTextField) &&
                        !(s instanceof JTable && ((JTable) s).isEditing())
                        ) {
                        music_player.pauseEvent();
                    }

                    //System.out.println(s.getClass().toString());
                }
                return true;
            }
        });

Es totalmente asqueroso y lo odio.  Desearía poder encontrar una manera de verificar si algún componente ha consumido la pulsación de tecla, entonces solo podría realizar el evento de pausa cuando la pulsación de tecla no fue accionada por ningún componente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top