【问题标题】:JDialog.setAlwaysOnTop(true) brings all dialogs to the front under WindowsJDialog.setAlwaysOnTop(true) 将所有对话框带到Windows下的最前面
【发布时间】:2012-02-14 06:14:34
【问题描述】:

我创建了两个对话框:
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 消失。转到 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 组件。
  • 您仍在主线程中创建和修改摆动组件。除了睡觉之外的所有事情都必须在 EDT 上完成。
  • 你是对的!但结果还是一样。
  • @JBNizet:考虑到 EDT [link]java.sun.com/products/jfc/tsc/articles/threads/threads1.html,我认为代码还可以
  • 不,不是。阅读docs.oracle.com/javase/6/docs/api/javax/swing/…。您链接到的文章可以追溯到 1998 年,并且已过时。

标签: java swing jdialog


【解决方案1】:

我为我的问题找到了一个“肮脏”的解决方案。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    相关资源
    最近更新 更多