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

2024-01-08

我创建两个对话框:
对话A:setVisible(true)只调用过一次。
对话B:setVisible(true) and setAlwaysOnTop(true)每 1.5 秒调用一次

Windows:每次调用dialogB.setAlwaysOnTop(true)将dialogA 和dialogB 带到前面。
OSX:每次调用dialogB.setAlwaysOnTop(true)只会将dialogB带到前面。 (预期行为)

测试用例(Windows):

1 我从 IDE 启动应用程序。
2 我看到对话A。
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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDialog.setAlwaysOnTop(true) 在 Windows 下将所有对话框置于最前面 的相关文章

随机推荐