JOptionPane显示在父JFrame后面

时间:2012-07-22 08:54:56

标签: java windows linux swing joptionpane

我在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如何以不同的方式为不同的OS运行相同的应用程序?)如何在Linux中的parentJFrame顶部获取它。这很紧急..
当'alwaysOnTop-true'组件显示JOptionPane时,JOptionPane出现在Linux中的组件后面。:(。但是这在Windows操作系统中处理得很好。在组件的顶部显示了JOptionPane,设置为'alwaysOnTop-true'。看起来,在Linux操作系统的桌面屏幕上显示组件存在冲突。我不确定。但我猜它。

  • Linux OS具有Oracle JDK和JRE 7

2 个答案:

答案 0 :(得分: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操作系统”,特别是在窗口管理方面 - 有很多不同的桌面环境和窗口管理器在窗口排序和可视性方面表现得非常不同,通常是故意的

答案 1 :(得分:1)

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

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

不要用双引号更改任何字符串。