Pergunta

Então eu quero acionar um evento (pausa / retoma de alguns meios de comunicação), sempre que o usuário pressiona barra de espaço em qualquer lugar do aplicativo meu Swing.

Uma vez que existem tantos controles e painéis que poderiam ter foco, não é realmente possível adicionar keyevents a todos eles (para não mencionar bruto).

Então, eu encontrei

KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher()

que é incrível, você pode registrar keypress pré-manipuladores globais. Há um grande problema embora - espaços será digitado o tempo todo em campos de entrada, as células da tabela, etc, e eu quero, obviamente, não faça para disparar o evento de pausa, em seguida,

Assim, qualquer idéias? Talvez haja maneira de detectar globalmente se o cursor está focado em algo que permite a entrada de texto, sem ter que verificar através de uma lista de todos os controles editáveis ??(vômito!)?

Foi útil?

Solução

Eu acho que você respondeu que a si mesmo - sim, eu acho que você pode descobrir o elemento atual que tem o foco, e se ele é um instanceof uma certa classe campo, você ignorar o espaço com o objetivo de evento de pausa. Se costuras desajeitada, não se preocupe, instanceof é muito rápido para a JVM (e em qualquer causa que você está falando eventos escala humanos que são uma eternidade para um processador).

Outras dicas

Estou enferrujado no meu balanço, mas acho que você deve tentar registrar um ouvinte mundial usando Toolkit.addAWTEventListener com um KEY_EVENT_MASK. Você pode então filtrar o processamento AWTEvent com base no seu tipo e fonte.

Ok ... Bem im tentando filtro com base em fonte. O problema é que meus ComboBoxes editáveis ??... Eles são instanceof

javax.swing.plaf.basic.BasicComboBoxEditor$BorderlessTextField

E desde BorderlessTextField é uma classe interna privada, eu aparentemente não pode fazer uma verificação instanceof contra ela.

idéias?

EDIT: ok assim que funciona este ....

 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;
            }
        });

Seu totalmente bruto e eu odeio isso. Eu gostaria de poder descobrir uma maneira de verificar se a pressão de tecla foi consumido por qualquer componente -. Então eu só poderia realizar o evento de pausa quando o keypress não foi acionado por qualquer componente

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top