【问题标题】:JOptionPane displays behind the parent JFrameJOptionPane 显示在父 JFrame 后面
【发布时间】:2012-07-20 21:14:24
【问题描述】:

我在 Windows 操作系统上创建了一个 swing 应用程序。我的一个 JDialog(其窗口是 parentJFrame)显示了一个 JOptionPane.
JOptionPane.showMessageDialog(parentJFrame, "I am a JOption");。

在运行时,parentJFrame setAlwaysOnTop(true) 。即使它设置了 alwaysOnTop-TRUE,JOptionPane 也会出现在 Windows 操作系统的 parentJFrame 上。但是当我在 Linux 操作系统上运行它时,JOptionPane 显示在 parentJFrame 后面。(可能是因为 parentJFrame alwyasOnTop 是真的,但是 JRE 如何以不同的方式为不同的操作系统运行相同的应用程序?)如何在 Linux 中将它放在 parentJFrame 的顶部?这是紧急的请..
当 'alwaysOnTop-true' 组件显示 JOptionPane 时,JOptionPane 出现在 Linux 中的组件后面.. :( 。但这在 Windows 操作系统中处理得很好。JOptionPane 显示在设置为 'alwaysOnTop-true' 的组件的顶部。似乎,在 Linux 操作系统的桌面屏幕上显示组件存在冲突。我不确定。但我猜是。

  • Linux 操作系统具有 Oracle JDK 和 JRE 7

【问题讨论】:

  • 为什么不使用 JOptionPane.showMessageDialog(myJDialog, "I am a JOption") ?
  • 谢谢。是的,我这样做了。然后JOptionPane 出现在JDialog 后面。在运行时,JOptionPane 也是 alwaysOnTop-true。

标签: java windows linux swing joptionpane


【解决方案1】:

您在 Linux 上看到的行为符合 API 规范。这就是Window.setAlwaysOnTop() 的含义:

如果有多个始终在顶部的窗口,则它们的相对顺序未指定且取决于平台。

还有:

always-on-top 窗口拥有的所有窗口都继承此状态并自动变为 always-on-top。

这可以解释为什么位于 JOptionPane 核心的 JDialog 也具有“始终处于顶部”状态。似乎偶然在 Windows 上它可以按您的预期工作,但实际上您是在要求 Swing 做一些不可能的事情:显示父级“始终高于其他窗口”,同时在其顶部显示对话框。

这是一个可能的解决方法:将对话框放在父级旁边,这样当它在 z 轴上时,用户仍然可以看到它:

JDialog dialog = new JOptionPane("Message").createDialog(parent, "Title");
Point dialogLoc = dialog.getLocation();
Point parentLoc = parent.getLocation();
dialog.setLocation(parentLoc.x + parent.getWidth(), dialogLoc.y);
dialog.setVisible(true);

请注意,没有单一的“Linux 操作系统”,尤其是在窗口管理方面 - 有许多不同的桌面环境和窗口管理器在窗口排序和可见性方面表现出截然不同的方式,通常是故意的.

【讨论】:

  • 非常感谢。我也有你说的感觉。很好的解释并感谢您的工作(我忘了查看 API,只是希望它应该像在 Windows 操作系统中一样工作。)和 API 指导。所有优点都给你..
【解决方案2】:

这很简单:在要显示对话框的代码之后写下这行代码:

        JOptionPane optionPane = new JOptionPane("Reports are Generated");
        JDialog dialog = optionPane.createDialog("Success!");
        dialog.setAlwaysOnTop(this.isAlwaysOnTopSupported());
        dialog.setVisible(true);

不要更改任何东西,除了双引号中的字符串。

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2015-04-22
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多