我创建两个对话框:
DialogA:setVisible(true)仅调用一次。
DialogB:每1.5秒调用一次setVisible(true)setAlwaysOnTop(true)
Windows:每次对dialogB.setAlwaysOnTop(true)的调用都将dialogA AND dialogB置于最前面。
OSX:每次对dialogB.setAlwaysOnTop(true)的调用都只将dialogB置于最前面。 (预期的行为)

测试用例(Windows):

1我从IDE启动应用程序。
2我看到了DialogA。
3我在IDE中单击,然后DialogA消失。
4一秒钟后,将显示DialogA和DialogB。
5我在IDE中单击,然后DialogA和DialogB消失。转到4

预期的行为(OSX):
4.一秒钟后,将显示DialogB。
5.我在IDE中单击,然后DialogB消失。转到4

题:
如何在Windows下获得预期的行为?

import javax.swing.JDialog;
import javax.swing.JLabel;
public class JDialogSetAlwaysonTopTEST
{
public static void main(String[] p_Strings)
{
    final JDialog dialogA = new JDialog();
    dialogA.setLocation(0, 0);
    dialogA.add(new JLabel("DialogA: Click on the overlapped   window"));
    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            dialogA.pack();
            dialogA.setVisible(true);
        }
    });

    try {Thread.sleep(3000);} catch (InterruptedException e){}

    final JDialog dialogB = new JDialog();
    dialogB.setLocation(70, 70);
    dialogB.add(new JLabel("DialogB:  Do you see DialogA?"));

    java.awt.EventQueue.invokeLater(new Runnable() {
        public void run() {
            dialogB.pack();
            dialogB.setVisible(true);
        }
    });

    while(true)
    {
        java.awt.EventQueue.invokeLater(new Runnable()  {
            public void run() {
                dialogB.setAlwaysOnTop(true);  //prerequisite
                dialogB.setVisible(true);
                dialogB.setAlwaysOnTop(false); //prerequisite
            }
        });
        try {Thread.sleep(1500);} catch (InterruptedException e){}
    }
}
}

最佳答案

我找到了解决问题的“肮脏”方法。

final JDialog dialogA = new JDialog(new JFrame());
...
final JDialog dialogB = new JDialog(new JFrame());

如果每个对话框都有一个独立的所有者dialogB.setAlwaysOnTop(true),则dialogB.setVisible(true)不会影响dialogA

07-24 19:29