1

我对模态对话框和undecorated有一个奇怪的问题JFrame

如果我创建一个未装饰的主目录JFrame,那么我会显示一个模式对话框,这要归功于JOptionPane,一切顺利。模态对话框始终位于顶部,我无法单击主要名声。

但是,如果创建另一个JFrame(或另一个JDialog),模态对话框仍然阻止我与主框架进行交互,但现在模态对话框并不总是在顶部,当我单击它时会进入主框架的下方。

不会发生此问题:

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

编辑

jdk1.7.0.0_09在e 上使用。Linux Sus但我有相同的结果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");
}
4

1 回答 1

4

但是,如果创建另一个 JFrame(或另一个 JDialog),模态对话框仍然阻止我与主框架进行交互,但现在模态对话框并不总是在顶部,当我单击它时会进入主框架的下方。

  • 根本不正确,在 JOptioPane 可见之前两者都不可访问

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

  • 您的问题中肯定还有其他不清楚的地方,其余代码,次要可能是Java版本和本机操作系统

在此处输入图像描述

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();
            }
        });
    }
}  
于 2013-02-01T12:07:07.807 回答