Oie amigos, boa noite!
Estou com um probleminha, eu estou querendo fechar meus jDialogs com a tecla Esc.
Até aí tudo bem, está fechando tudo certinho, o problema é que por exemplo, eu tenho um cadastro de cliente, e uma pesquisa de cliente, se eu clico o esc na pesquisa, o dialog do cadastro que esta por tras tambem é fechado. Como posso resolver o problema?
Uso o seguinte codigo para fazer? Tem alguma coisa errada? Como fechar somente o dialog que esta em primeiro plano?
Obs.: Tentei colocar uma verificacao para ver se o dialog era o dono do foco com o metodo isFocusOwner mais nao resolveu, ele até fecha a primeira, mais se clico em esc novamente ele nao fecha, como se nunca dialog é o dono do foco, nao sei mais o que fazer, fiquei sem ideia. rsrsrs
Segue meu codigo
private void formWindowOpened(java.awt.event.WindowEvent evt) {
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
@Override
public void eventDispatched(final AWTEvent event) {
if (event.getID() == KeyEvent.KEY_PRESSED) {
final KeyEvent evt = (KeyEvent) event;
if (verificaEsc == false) {
if (evt.getKeyCode() == KeyEvent.VK_ESCAPE) {
verificaEsc = true;
acaoSair();
}
}
}
}
}, AWTEvent.KEY_EVENT_MASK);
}
Alguém pode me ajudar?
Obrigada!
Registre isso no seu rootPane (pode ser feito no construtor de suas janelas):
JRootPane rootPane = this.getRootPane();
KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
rootPane.registerKeyboardAction(actionListener, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
Onde actionListener refere-se ao actionlistener que fecha a sua janela (provavelmente acaoSair).
Entretanto, eu desaconselho que você faça isso. Já usei isso num sistema as dores de cabeça não compensam. O recurso não traz nenhuma vantagem real ao usuário. Se um dos seus processos demorar e o usuário pressionar ESC para cancelar o processamento, ele terá o inconveniente de esperar o processamento terminar e a janela fechar logo depois que o que ele queria fica pronto. E isso para ele é BASTANTE frustrante.
Olá ViniGodoy, tudo bem?
Não consegui fazer funcionar…
Eu coloquei assim e realmente agora ele só fecha o frame, mais se clico no esc novamente com esse dialog somente aberto ele não fecha, simplesmente nao acontece nada.
JRootPane jRootPane = this.getRootPane();
KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
jRootPane.registerKeyboardAction(this.btnCancelar.getAction(), stroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
sendo que meu ActionListener:
btnCancelar.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCancelarActionPerformed(evt);
}
});
e meu actionPerformed:
private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {
this.dispose();
}
Obs.: Código gerado pelo Netbeans.
Estou colocando meu actionperformed de maneira errada?
Obrigada!
Tente colocar o ActionListener diretamente:
[code]ActionListener cancelAction = new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
btnCancelarActionPerformed(evt);
}
};
jRootPane.registerKeyboardAction(cancelAction, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW);[/code]
Eu uso esse código há anos, sempre funcionou bem.