Extend JDialog

From Stack Overflow
Jump to: navigation, search
package org.ninjasoft.dialogs;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

/**
 * Extend this instead of JDialog to automatically handle
 * common operations like what happens when the user
 * pushes ESC or Enter as well as selecting field
 * content when focus travels to a JTextField.
 */
public abstract class EscapeDialog extends JDialog 
implements ContainerListener, KeyListener, FocusListener {

    /**
     * Constructor registers to know about adding/removing
     * widgets to the dialog so that we can add key handlers
     * to them all
     */    
    public EscapeDialog(Frame owner, String title) {
        super(owner, title);
        addKeyAndContainerListenerRecursively(this);
    }
    
    /**
     * An element has focus--if it is a JTextField, select
     * the content (so that typing will easily overwrite the
     * current content
     */
    public void focusGained(FocusEvent e) {
        Object object = e.getSource();
        if (object instanceof JTextField) {
            JTextField field = (JTextField) object;
            field.setSelectionStart(0);
            field.setSelectionEnd(field.getText().length());
        }
    }
    
    public void focusLost(FocusEvent e) {}

    /**
     * Something was added to the JDialog, so register as a 
     * KeyListener and ContainerListener
     */
    public void componentAdded(ContainerEvent e)
    {
        addKeyAndContainerListenerRecursively(e.getChild());
    }

    /**
     * Something was removed from the JDialog, so unregister as a 
     * KeyListener and ContainerListener
     */
    public void componentRemoved(ContainerEvent e)
    {
        removeKeyAndContainerListenerRecursively(e.getChild());
    }

    /**
     * Register as a KeyListener to the new component, and if it is a
     * container, also register as a ContainerListener so we know
     * if it gets new child objects.
     */    
    private void addKeyAndContainerListenerRecursively(Component c) {
        // Add KeyListener to the Component passed as an argument
        c.addKeyListener(this);
        // Check if the Component is a Container
        if (c instanceof Container) {
            // Component c is a Container. The following cast is safe.
            Container cont = (Container)c;
            // Add ContainerListener to the Container.
            cont.addContainerListener(this);
            // Get the Container's array of children Components.
            Component[] children = cont.getComponents();
            // For every child repeat the above operation.
            for(int i = 0; i < children.length; i++){
                addKeyAndContainerListenerRecursively(children[i]);
            }
        }
        if (c instanceof JTextField)
            c.addFocusListener(this);
    }

    /**
     * Same as above, only remove.
     */
    private void removeKeyAndContainerListenerRecursively(Component c) {
        // Add KeyListener to the Component passed as an argument
        c.removeKeyListener(this);
        // Check if the Component is a Container
        if(c instanceof Container) {
            // Component c is a Container. The following cast is safe.
            Container cont = (Container)c;
            // Add ContainerListener to the Container.
            cont.addContainerListener(this);
            // Get the Container's array of children Components.
            Component[] children = cont.getComponents();
            // For every child repeat the above operation.
            for(int i = 0; i < children.length; i++){
                removeKeyAndContainerListenerRecursively(children[i]);
            }
        }
    }

    /**
     * A key was pressed--was it ENTER or ESC?
     */
    public void keyPressed(KeyEvent e)
    {
        int code = e.getKeyCode();
        if(code == KeyEvent.VK_ESCAPE) {
            performEscapeAction(e);
        } else if(code == KeyEvent.VK_ENTER) {
            performEnterAction(e);
        }
    }
    public void keyReleased(KeyEvent e) {}
    public void keyTyped(KeyEvent e) {}

    /**
     * Enter key was pressed
     */
    protected abstract void performEnterAction(KeyEvent e);
    /**
     * ESC key was pressed
     */
    protected abstract void performEscapeAction(KeyEvent e);
}
Personal tools