父的JFrame背后的JOptionPane显示(JOptionPane displays behi

2019-09-20 00:01发布

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

在运行时, parentJFrame setAlwaysOnTop(true) 。 尽管它已成立alwaysOnTop真时,JOptionPane的appeares上Windows操作系统的parentJFrame。 但是当我跑了它在Linux操作系统中,parentJFrame背后的JOptionPane显示。(可能是这个原因是parentJFrame alwyasOnTop是真的 ,但JRE的运行方式在不同势OS期不同方式相同的应用程序?)我怎样才能得到它的在Linux中parentJFrame的顶部? 这是迫切的,请..
当“alwaysOnTop真”组分显示的JOptionPane,出现的JOptionPane在Linux下部件后面.. :(但这处理好了在Windows操作系统。JOptionPane中被显示在其上设置“alwaysOnTop真”组件的顶部。它似乎有一个矛盾显示在Linux操作系统的桌面屏幕上的组件。我不敢肯定这样的,但我想它。

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

Answer 1:

在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操作系统”,尤其是当它涉及到窗口管理 - 有很多,在广泛不同的行为方式,当涉及到窗口排序和知名度不同的桌面环境和窗口管理器,经常故意。



Answer 2:

这是非常简单的:要显示ddialog框的代码后写这行代码:

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

不要在双引号改变什么exept字符串。



文章来源: JOptionPane displays behind the parent JFrame