2012-07-22 29 views
2

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

在运行时,parentJFrame setAlwaysOnTop(true)。即使它设置了alwaysOnTop-TRUE,JOptionPane也会出现在Windows操作系统的parentJFrame上。但是当我在Linux操作系统上运行它时,JOptionPane显示在parentJFrame后面(可能是因为parentJFrame alwyasOnTop是真的,但是JRE如何以不同的方式为不同的操作系统运行相同的应用程序?)我怎样才能得到它在Linux的parentJFrame的顶部。?这是当务之急..
当'alwaysOnTop-true'组件显示一个JOptionPane时,JOptionPane出现在Linux的组件后面。:(但是这在Windows操作系统中处理得很好,JOptionPane显示在组件的顶部设置“alwaysOnTop真”。它似乎有一个矛盾显示在Linux操作系统的桌面屏幕上的组件。我不敢肯定这样的,但我想它。

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

为什么不使用JOptionPane.showMessageDialog(myJDialog,“我是一个JOption”)? – Reimeus 2012-07-22 09:40:54

+0

谢谢你。是的,我做到了。然后JOptionPane出现在JDialog后面。在运行时,JOptionPane也始终处于真实状态。 – 2012-07-22 09:59:01

回答

5

你在Linux上看到的行为符合API规范,这就是它对Window.setAlwaysOnTop()的说法:

如果存在多个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操作系统”,尤其是涉及到窗口管理的时候,有很多不同的桌面环境和窗口管理器,在涉及窗口排序和可见性时,它们的行为往往有很大不同,通常是故意的。

+0

非常感谢。我也像你说的那样感觉到。很好的解释和感谢你的工作(我忘了看API,只是希望它能像windows操作系统一样工作。)和API指南。所有优点给你.. – 2012-07-22 10:10:52

1

这是非常简单的:

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

不要改变什么exept字符串在双引号:要显示ddialog框的代码后写这行代码。