2

我在 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
4

2 回答 2

5

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

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

并且:

始终位于顶部的窗口拥有的所有窗口都继承此状态并自动变为始终位于顶部。

这可以解释为什么位于 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 操作系统”,特别是在窗口管理方面 - 有许多不同的桌面环境和窗口管理器在窗口排序和可见性方面表现得截然不同,通常是故意的。

于 2012-07-22T10:03:21.677 回答
1

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

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

除了双引号中的字符串之外,不要更改任何内容。

于 2013-12-11T13:22:42.937 回答