当另一个JFrame可见时,模态对话框并不总是位于未修饰的JFrame之上

时间:2013-02-01 11:54:23

标签: java linux swing jframe modal-dialog

对于模态对话未修饰JFrame,我遇到了一个奇怪的问题。

如果我创建一个未修饰的主JFrame,那么我会显示一个模态对话框,感谢JOptionPane,一切顺利。模态对话框始终位于顶部,我无法点击主要名声。

但是,如果创建另一个JFrame(或另一个JDialog),模态对话框仍然阻止我与主框架交互,但现在模态对话框并不总是位于顶部并且位于点击它时的主框架。

这个问题不会发生:

  • 如果主框架已装饰
  • 或如果第二帧不可见

修改

我在jdk1.7.0.0_09上使用Linux Sus e。但我与jre 1.6.0_32

的结果相同

我用来测试的代码:

 public static void main(String[] args) {
    // creates main frame and set visible to true
    final JFrame mainFrame = new JFrame();
    mainFrame.setUndecorated(true); // if I comment this line, everything goes well
    mainFrame.add((new JPanel()).add(new JButton("OK")));
    mainFrame.setSize(new Dimension(500, 500));
    mainFrame.setVisible(true);
    // creates a dialog and set visible to true
    JFrame anotherFrame = new JFrame();
    anotherFrame.setVisible(true); // or if I comment this line, everything goes well too
    // display a modal dialog
    JOptionPane.showMessageDialog(mainFrame, "A message");
}

1 个答案:

答案 0 :(得分:4)

  

但是,如果创建另一个JFrame(或另一个JDialog),则为模态对话框   仍然阻止我与主框架互动,但现在是模态   对话框并不总是在顶部,当我在主框架下面时   点击它。

  • 根本不是真的,两者都不可访问,直到JOptioPane可见

  • JOptionPane或JDialod.setModal(true)阻止从currnet JVM调用的alll窗口的鼠标或键事件

  • 必须有一些其他问题不清楚,其余的代码,次要的可能是Java版本和Native OS

enter image description here

Java6代码(winxp),适用于Win7 / Java7(x.x_011)

import java.awt.Dimension;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Main {

   private JFrame mainFrame = new JFrame();
   private JFrame anotherFrame = new JFrame();

    public Main() {
        mainFrame.setUndecorated(true);
        mainFrame.add((new JPanel()).add(new JButton("OK")));
        mainFrame.setSize(new Dimension(100, 60));
        mainFrame.setVisible(true);
        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        anotherFrame.setVisible(true);
        anotherFrame.setLocation(110, 0);
        anotherFrame.setSize(new Dimension(100, 60));
        anotherFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JOptionPane.showMessageDialog(mainFrame, "A message");
    }


    public static void main(String[] args) {
       java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                Main main = new Main();
            }
        });
    }
}