JDialog.setAlwaysOnTop(true)可以将所有对话框在Windows下置于最前面

4
我创建了两个对话框:
DialogA:仅调用一次setVisible(true)
DialogB:每1.5秒调用一次setVisible(true)setAlwaysOnTop(true)
在Windows系统中,每次调用dialogB.setAlwaysOnTop(true)都会将DialogA和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){}
    }       
}
}

不知道是否会有所不同,但您可以从尊重Swing的线程策略开始,并仅在EDT中使用Swing组件。 - JB Nizet
3
你仍然在主线程中创建和修改摆动组件。除了睡眠以外的所有操作都必须在事件分派线程(EDT)上执行。 - JB Nizet
你是对的!但结果仍然相同。 - Peter
@JBNizet:考虑到EDT,我认为代码没问题 [链接]http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html - Peter
不是这样的。请阅读http://docs.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading。你提供的链接文章来自1998年,已经过时了。 - JB Nizet
我的错误:请参见[链接]https://dev59.com/JHRB5IYBdhLWcg3w26x3#491377 - Peter
1个回答

1
我找到了一个“不太优雅”的解决方案来解决我的问题。
final JDialog dialogA = new JDialog(new JFrame());
...
final JDialog dialogB = new JDialog(new JFrame());

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接