KeyListeners não respondem no JPanel: um problema comum
Ao usar KeyListeners para detectar pressionamentos de tecla em um JPanel, os desenvolvedores geralmente encontram o problema em que o os ouvintes não conseguem acionar as ações desejadas. Esse problema pode surgir de vários fatores.
Restrições de componentes em foco
KeyListeners dependem de se anexarem ao componente em foco para funcionar corretamente. Por padrão, o foco não é concedido automaticamente a um JPanel. Para resolver esse problema, defina explicitamente a capacidade de foco e solicite o foco no construtor do JPanel:
public JPanel extends JPanel implements KeyListener {
public JPanel() {
this.addKeyListener(this);
this.setFocusable(true);
this.requestFocusInWindow();
}
Alternativa: Key Bindings
Embora definir o foco manualmente seja uma solução viável, uma abordagem mais robusta é utilizar Key Bindings. As associações de teclas fornecem um mecanismo flexível para associar pressionamentos de tecla a ações específicas. Para implementar associações de teclas em um JPanel:
public JPanel extends JPanel implements ActionListener {
public JPanel() {
setupKeyBinding();
this.setFocusable(true);
this.requestFocusInWindow();
}
private void setupKeyBinding() {
int condition = JComponent.WHEN_IN_FOCUSED_WINDOW;
InputMap inMap = getInputMap(condition);
ActionMap actMap = getActionMap();
inMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "Left");
actMap.put("Left", new leftAction());
}
private class leftAction extends AbstractAction {
public void actionPerformed(ActionEvent e) {
System.out.println("test");
}
}
}
Neste exemplo, a classe leftAction define a ação a ser executada quando a tecla de seta para a esquerda for pressionada (neste caso, imprimindo "test" no console).
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3