<Swing Dev> [macos] regression in dialog modality in High Sierra and Mojave

Vladislav Protasov vladislav.protasov at gmail.com
Mon Nov 19 11:22:10 UTC 2018


Hi All,

Please see
https://bugs.openjdk.java.net/browse/JDK-8182638
it was marked as fixed but now the test fails again
in High Sierra and Mojave:

Exception in thread "AWT-EventQueue-0" java.lang.RuntimeException: The
second dialog window was not on top
at
com.infolytik.ui.JDialog392$SecondDialogListener.windowOpened(JDialog392.java:160)


Also, there is another (maybe related) problem which is only
reproducible in  High Sierra and Mojave (but works ok in plain  Sierra)

Steps:
1. run sample DialogModalityTest2,

2. See a frame with the button "Show Dialog 1"

3. Press Command+Tab to switch to another application, then Command+Tab
again to come back.

4. Click "Show Dialog 1", then click  "Show Dialog 2", close Dialog 2.

5. Notice that Dialog 1 is not closed while setVisible(false) and dispose()
were called on both dialogs. Dialog 1 becomes non-modal zombie dialog.


repeat steps 1,2, 4 (without step 3) and notice that Dialog 1 was closed as
expected.

public class DialogModalityTest2 extends JFrame {
    private JDialog dlg1, dlg2;

    public DialogModalityTest2() {
        super("Frame");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(100, 100, 300, 300);
        dlg1 = new Dialog1(this);
        dlg2 = new JDialog(dlg1, "Dialog 2", true);


        dlg2.addWindowFocusListener(new WindowFocusListener() {
            @Override
            public void windowGainedFocus(WindowEvent e) {
                System.out.println("dlg2 windowGainedFocus " + e);
            }

            @Override
            public void windowLostFocus(WindowEvent e) {
                System.out.println("dlg2 windowLostFocus " + e);
            }
        });

        dlg1.addWindowFocusListener(new WindowFocusListener() {
            @Override
            public void windowGainedFocus(WindowEvent e) {
                System.out.println("! dlg1 windowGainedFocus " + e + "
" + dlg1);

            }

            @Override
            public void windowLostFocus(WindowEvent e) {
                System.out.println("! dlg1 windowLostFocus " + e + " " + dlg1);
                printFocus();

                System.out.println();
                System.out.println("windowLostFocus printFocus again
in invokeLater...");
                SwingUtilities.invokeLater(() -> printFocus());
            }
        });

        JButton button = new JButton("Show Dialog 1");

        button.addActionListener(e -> {
            dlg1.setBounds(300, 150, 300, 200);
            dlg1.setVisible(true);

            System.out.println();
            System.out.println("button.addActionListener DIALOG 1 closed");
            printFocus();

            System.out.println();
            System.out.println("button.addActionListener printFocus
again in invokeLater...");
            SwingUtilities.invokeLater(() -> printFocus());

        });

        setLayout(new FlowLayout());
        add(button);
        JButton dummy = new JButton("Dummy");
        add(dummy);

        dummy.addActionListener(e -> {
            printFocus();
        });

    }

    private void printFocus() {
        System.out.println("getFocusedWindow =" +
KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow());
        System.out.println("frame is isFocused=" +
DialogModalityTest2.this.isFocused());
        System.out.println("getFocusOwner =" +
KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusOwner());
    }

    private class Dialog1 extends JDialog {
        private Dialog1(JFrame owner) {
            super(owner, "Dialog 1", true);
            JButton button = new JButton("Show Dialog 2");

            button.addActionListener(e -> {
                Window[] ownerlessWindows = getOwnerlessWindows();
                System.out.println("ownerlessWindows:" +
ownerlessWindows.length);

                dlg2.setBounds(500, 225, 250, 100);
                dlg2.setVisible(true);


                dlg1.setVisible(false);
                dlg1.dispose();

                System.out.println("1 isVisible? " + dlg1.isVisible()
+ " isShowing " + dlg1.isShowing() + " isModal " + dlg1.isModal() + "
isActive " + dlg1.isActive());
                System.out.println("2 isVisible? " + dlg2.isVisible()
+ " isShowing " + dlg2.isShowing() + " isModal " + dlg2.isModal() + "
isActive " + dlg2.isActive());


                System.out.println(dlg2);

                System.out.println("getFocusedWindow =" +
KeyboardFocusManager.getCurrentKeyboardFocusManager().getFocusedWindow());
                System.out.println("frame is isFocused=" +
DialogModalityTest2.this.isFocused());

                ownerlessWindows = getOwnerlessWindows();
                System.out.println("ownerlessWindows:" +
ownerlessWindows.length);

                for (Window w : ownerlessWindows)
                    if (w instanceof JDialog)
                        System.out.println("ownerlessWindow: " + w);

                Window[] window = getWindows();
                System.out.println(window.length);
                for (Window w : window)
                    if (w instanceof JDialog)
                        System.out.println(w);

            });

            add(button);
        }
    }

    public static void main(String[] args) {
        System.out.println(System.getProperty("java.version"));

        EventQueue.invokeLater(() -> new
DialogModalityTest2().setVisible(true));
    }
}

Thank you,
Vlad



ReplyForward
<https://drive.google.com/u/0/settings/storage?hl=en>
<https://www.google.com/intl/en/policies/terms/>
<https://www.google.com/intl/en/policies/privacy/>
<https://www.google.com/gmail/about/policy/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/swing-dev/attachments/20181119/0e850b17/attachment-0001.html>


More information about the swing-dev mailing list