“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

http://java.sun.com/j2se/1.5.0/docs/api/

http://www.javaworld.com/