4

我有一个生成两个 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

}

我什至尝试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.
                }
            });
        }
    });
}

想法?我什么都没有。

4

2 回答 2

5

如何使 JDialog 不总是在父级之上

如本问答所述:setModal issue with 2 Jdialogs within a Jframe

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

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

于 2014-03-08T02:11:19.393 回答
0

这很容易实现,见以下代码:

    JFrame frame = new JFrame();
    frame.setBounds(0,0,400,200);
    frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);

// Special attention to this line, do not use same JFrame, create a dummy JFrame
// If you want to save memory you can also use new JDialog((JFrame)null)
    JDialog jd = new JDialog(new JFrame());
    jd.setModalityType(Dialog.ModalityType.MODELESS);
    jd.setBounds(0,0,100, 100);
    jd.setVisible(true);
于 2014-03-07T21:25:13.023 回答