加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – JDialog.setAlwaysOnTop(true)将所有对话框带到Windows

发布时间:2020-12-15 02:30:56 所属栏目:Java 来源:网络整理
导读:我创建了两个对话框: DialogA:setVisible(true)只调用一次. DialogB:setVisible(true)和setAlwaysOnTop(true)每1.5秒调用一次 Windows:每次调用dialogB.setAlwaysOnTop(true)都会将dialogA和dialogB带到前面. OSX:每次调用dialogB.setAlwaysOnTop(true)
我创建了两个对话框:
DialogA:setVisible(true)只调用一次.
DialogB:setVisible(true)和setAlwaysOnTop(true)每1.5秒调用一次

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消失. GOTO 4

预期行为(OSX):
4.一秒钟后,DialogB将出现.
5.我在IDE中单击并且DialogB消失. GOTO 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读