import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

public class EscDialog4m extends JFrame {

    JButton b, b2;
    JTextField f;
    public EscDialog4m() {
        super();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        b = new JButton("show");
        setSize(320, 240);
        getContentPane().setLayout(new BorderLayout());
        b.setBounds( 50, 75, 200, 50 );
        b.addKeyListener( new MyKeyAdapter());
        JPanel p = new JPanel();
        p.setLayout(null);
        f = new JTextField("dummy");
        f.setBounds( 50, 30, 200, 24 );
        f.addKeyListener( new MyKeyAdapter());
        b2 = new JButton("show too");
        b2.setBounds( 50, 140, 200, 50 );
        b2.addKeyListener( new MyKeyAdapter());
        p.add(f);
        p.add(b);
        p.add(b2);
        getContentPane().add(p, BorderLayout.CENTER);

//        new Thread() {
//            @Override
//            public void run() {
//                while(true) {
//                    try {
//                        if (d != null) {
//                            Thread.sleep(10);
//                            if (d != null) {
//                                d.dispose();
//                            }
//                        }
//                        Thread.sleep(10);
//                    } catch (InterruptedException e) {}
//                }
//            }
//        }.start();

    }
    JDialog d;

    static volatile boolean f12handled = true;
    static int f12pressed = 0;
    static int f12processed = 0;

    public class MyKeyAdapter extends KeyAdapter {
        public void keyPressed(KeyEvent e) {
//            if (e.getKeyCode() == e.VK_ESCAPE) {
            if (e.getKeyCode() == e.VK_F12) {
                final Component c = (Component)e.getSource();
                c.transferFocus();
                f.requestFocusInWindow();
                JOptionPane op = new JOptionPane("Test message",
                        JOptionPane.PLAIN_MESSAGE, JOptionPane.YES_NO_OPTION) {
                    // disable built-in requestFocus() at JOptionPane.
                    public void selectInitialValue() {}
                };
                // enqueueKeyEvents set to Dialog itself at show().
                d = op.createDialog(EscDialog4m.this, "dialog");
                d.show();
                d = null;
                f12handled = true;
                f12processed++;
            } else if (e.getKeyCode() == e.VK_F11) {
                // Need to stack multiple Lightweight focus requests.
                final Component c = (Component)e.getSource();
                c.transferFocus();
                f.requestFocusInWindow();
            }
        }
    }

    public static void main(String[] args) throws Exception {
        EscDialog4m obj = new EscDialog4m();
        obj.show();

        KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener("focusOwner", new PropertyChangeListener() {
            @Override
            public void propertyChange(PropertyChangeEvent event) {
//                System.out.println("### new owner: " + event.getNewValue());
            }
        });

        Robot r = new Robot();
//        r.setAutoDelay(5);

        ((sun.awt.SunToolkit) Toolkit.getDefaultToolkit()).realSync();
        Thread.sleep(100);

        boolean loop = true;
        int f12failcounter = 0;
        while(loop) {
            if (f12handled || f12failcounter > 300) {
                f12failcounter = 0;
                f12handled = false;
                r.keyPress(KeyEvent.VK_F12);
                r.keyRelease(KeyEvent.VK_F12);
                f12pressed++;
                System.out.println("F12 typed: " + f12pressed + ", dialogs opened: " + f12processed);
            } else {
                f12failcounter++;
            }
            r.keyPress(KeyEvent.VK_ESCAPE);
            r.keyRelease(KeyEvent.VK_ESCAPE);
            r.keyPress(KeyEvent.VK_F11);
            r.keyRelease(KeyEvent.VK_F11);
            Thread.sleep(5);
        }
    }
} 