Hi Vlad, In this case the observed behaviour is quite expected because the fix for JDK-8182638 [1] was not ported to JDK 8.
Thanks, Dmitry [1] - https://bugs.openjdk.java.net/browse/JDK-8182638 > On 31 Jan 2019, at 10:55, Vladislav Protasov <vladislav.prota...@gmail.com> > wrote: > > Hi Dmitry, > > It was Java 8 > > Thanks, > Vlad > > On Thu, Jan 31, 2019 at 5:25 PM Dmitry Markov <dmitry.mar...@oracle.com > <mailto:dmitry.mar...@oracle.com>> wrote: > Hi Vlad, > > I cannot reproduce the issue on High Sierra with JDK11 and JDK12. What > version of java do you use? > > Thanks, > Dmitry > >> On 19 Nov 2018, at 10:52, Vladislav Protasov <vladislav.prota...@gmail.com >> <mailto:vladislav.prota...@gmail.com>> wrote: >> >> Hi All, >> >> Please see >> https://bugs.openjdk.java.net/browse/JDK-8182638 >> <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 >> >> >> >