如何使JDialog不总是位于父级之上

cap*_*ors 4 java swing jdialog modality

我有一个生成两个JDialogs的JFrame。这三个窗口中的每个窗口都必须是可聚焦的(这是我当前编写的方式),但是JFrame不会放在对话框的顶部。当您单击任一对话框时,它们会彼此弹出(就像一个人所期望的那样),但是JFrame只是拒绝出现在最前面。

我需要它们保留JDialogs(而不是JFrames本身),因为大多数当前行为都是可取的(即,当另一个窗口/应用程序阻止任何或所有窗口时,如果选择任何窗口,它们都位于最前面) (而三个JFrame只会导致选中的一个出现)。

我的JDialogs构造函数可以达到以下效果:

SubDialog(JFrame parent /*, a handful, ofOther arguments */){
    super(parent, ModalityType.MODELESS); //not even the modeless helped
    setAlwaysOnTop(false); //not even the not always on top helped
    setUndecorated(true); //maybe this has something to do with it (unlikely, just fyi)?

    //some simple variable assignments

}
Run Code Online (Sandbox Code Playgroud)

我什至试图setAlwaysOnTop(true)在我的JFrame中扔一个。没有骰子。我感到绝望,甚至尝试了以下数字之一:

MyJFrame(String title){
    super(title);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    addWindowFocusListener(new WindowAdapter(){
        public void windowGainedFocus(WindowEvent e){
            final Window w = e.getWindow();

            //PLEASE come to the front
            w.toFront();

            //even MOAR desperation
            SwingUtilities.invokeLater(new Runnable(){
                public void run(){
                    w.toFront(); //STILL no dice.
                }
            });
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?我没什么。

dic*_*c19 5

如何使JDialog不总是位于父级之上

如本问答中所述:在Jframe中有2个Jdialog的setModal问题

此行为取决于本机窗口系统如何处理焦点窗口和活动窗口。话虽如此,如果您调用例如toFront(),它将尝试将窗口放置在堆栈的顶部,但是某些平台不允许拥有其他窗口的窗口出现在其子视图的顶部。当您调用toBack()方法时,也会发生相同的情况。有关更多详细信息,请参见javadocs。

例如,在Windows 7上,父对话框变为焦点,但其子对话框仍在顶部显示(而不是焦点)。如上所述,由窗口系统决定如何处理此问题。

  • 换句话说,“这不能(干净地)完成”。我以前很怕那个。 (2认同)