“ESC” to JDialog Close
Descubra como programar seus JDialog´s para fechar ao pressionar a tecla “ESC”
Como é da curiosidade de muitos, e vejo muitas dicas inconsistentes sobre como fazer isso, resolvi escrever esse artigo explicando de uma forma simples como criar um JDialog que feche ao acionamento da tecla “ESC”.
Por padrão esse funcionalidade não é oferecida em nenhum dos diálogos tanto do pacote AWT como do JFC/Swing.
Precisaremos criar uma sub-classe de JDialog, definir o ActionListener para fechar o JDialog e registrar a tecla ESC na chamada ao ActionListener. Então, quando o usuário pressionar ESC enquanto o JDialog estiver aberto (visível), ele se fechará automaticamente.
Podemos separar esse processo em três etapas:
1.) Criando a sub-classe
public class EscDialog extends JDialog {
...
}
2.) Definindo o ActionListener
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
}
3.) Utilizando a recursividade para definir e registrar o
acionamento da tecla ESC
protected JRootPane createRootPane() {
KeyStroke stroke =
KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
JRootPane rootPane = new JRootPane();
rootPane.registerKeyboardAction(
actionListener, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
return rootPane;
}
Tecnicamente falando, você pode criar e utilizar seu “novo e improvisado” JDialog (EscDialog) em todos os seus aplicativos baseados em AWT / JFC/Swing.
Da perspectiva de usabilidade, você pode replicar todos os construtores da classe JDialog.
Abaixo, você poderá ver um exemplo completo de como utilizar os exemplos acima:
Definição da classe EscDialog.java
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JRootPane;
import javax.swing.KeyStroke;
public class EscDialog extends JDialog {
//Sobrepondo um dos construtores de JDialog
public EscDialog(JFrame parent, String title) {
// Chamando o construtor da super-classe
super(parent, title);
setLocationRelativeTo(null);
}
// Sobrepondo o método createRootPane()
protected JRootPane createRootPane() {
// Definindo o ActionListener
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
setVisible(false);
}
};
// Definindo o KeyStroke
KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
// Criando uma instancia de JRootPane
JRootPane rootPane = new JRootPane();
// Registrando o KeyStroke enquanto o JDialog estiver em foco
rootPane.registerKeyboardAction(
actionListener, stroke, JComponent.WHEN_IN_FOCUSED_WINDOW);
// Retornando o novo e modificado JRootPane
return rootPane;
}
}
Definição
da classe EscSampleFrame.java
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
public class EscSampleFrame {
public static void main(String[] args) {
final JFrame frame = new JFrame("Exemplo de JDialog com ESC");
ActionListener dialogActionListener = new ActionListener() {
// Criando uma instancia de EscDialog
// utilizando um dos 11 construtores disponiveis
// na super-classe
// Nosso JDialog personalizado com a função de
// fechar quando o usuário pressionar a tecla ESC
JDialog dialog = new EscDialog(frame, "EscDialog - Exemplo");
// Utilizando um Singleton para garantir
// apenas uma instancia do JDialog
{
JButton button = new JButton("OK");
ActionListener innerActionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.out.println("Botao OK do JDialog Pressionado");
}
};
button.addActionListener(innerActionListener);
dialog.getContentPane().add(button, BorderLayout.SOUTH);
}
public void actionPerformed(ActionEvent e) {
dialog.setSize(400, 300);
dialog.setVisible(true);
}
};
JButton dialogButton = new JButton("Abrir JDialog");
dialogButton.addActionListener(dialogActionListener);
frame.getContentPane().add(dialogButton, BorderLayout.NORTH);
WindowListener windowListener = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
frame.addWindowListener(windowListener);
frame.setSize(400, 300);
frame.setVisible(true);
}
}
Sendo assim, finalizamos a implementação do JDialog com a função de fechar quando o usuário pressionar a tecla ESC.
Espero que esse artigo ajude a sanar suas duvidas. Caso não tenha entendido alguma implementação, não hesite em me escrever!!!!
Fontes