java 1.6中Swing中的Dialog Modality问题

时间:2016-01-09 11:19:15

标签: java swing modal-dialog jdialog

我有3个对话框,可以在我的项目中一起显示。

  • 第一个对话框是setVisibleOnTop(false)无模式的。
  • 第二个对话框是setVisibleOnTop(true)无模式的。
  • 第三个对话框是带有setVisibleOnTop(true)的应用模式。

现在的问题是:

  1. 理想情况下,当使用APPLICATION_MODAL属性打开“第三个”对话框时,其他任何JComponent都不应接受该点击。这适用于java 1.7。
  2. 使用java 1.6,我点击对话框“one”,然后对话框“second”进入对话框“one”的后面。对话框“第三”仍然打开。
  3. 现在的问题是:

    • 当打开APPLICATION_MODAL对话框(第三个)时,为什么对话框“one”出现在前面?
    • 为什么第二个带有属性setAlwaysOnTop(true)的对话框会回来?
    • 我认为这是java 1.6的一个问题。有谁知道这件事?
    • 这个错误记录在哪里吗?

    示例代码:

    import java.awt.Frame;
    
    import javax.swing.JDialog;
     class MyDialog1 extends JDialog {
    
         MyDialog1 ()
        {
            super();
            super.setVisible(false);
            setTitle("one");
        }
    
    
    }
    
    
     class MyDialog2 extends JDialog {
    
         MyDialog2 ()
            {
             super(null,ModalityType.MODELESS);
                setAlwaysOnTop(true);
                setTitle("second");
    
            }
    
        }
    
    
     class MyDialog3 extends JDialog {
    
         MyDialog3 ()
        {
            super(new Frame(),ModalityType.APPLICATION_MODAL);
            setTitle("third");
            setAlwaysOnTop(true);
            super.setVisible(false);
    
        }
    
    }
    
    public class ModalityIssue {
    
        public static void main(String args[])
        {
            MyDialog1 d1=new MyDialog1();
            d1.setSize(600, 600);
    
            MyDialog2 d2=new MyDialog2();
            d2.setSize(500, 500);
    
            MyDialog3 d3=new MyDialog3();
            d3.setSize(400, 400);
    
            d1.setVisible(true);
            d2.setLocationRelativeTo(d1);
            d2.setVisible(true);
            d3.setLocationRelativeTo(d2);
            d3.setVisible(true);
        }
        }
    

1 个答案:

答案 0 :(得分:1)

  • 不要使用awt组件

  • JFrame忽略alwaysOnTop和modality,

  • 使用初始线程,

  • 重要的是代码排序

  • 你可以使用aplication方式(似乎更好,但没有人知道是否符合你的要求)

  • MyDialog1总是闪烁(MyDialog2在MyDialog1之前被绘制,然后跳过惊吓MyDialog2,标准用户无法捕获它),也许没有任何JComponents添加到当前JVM中的任何顶级容器< / p>

例如(Java 1.6.21 / 025/031,同样的corerctly适用于1.7.04和1.8.60 / 66 / win10)

import java.awt.Dialog.ModalityType;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

class MyDialog1 extends JDialog {

    public MyDialog1() {
        super(null, ModalityType.MODELESS);
        setAlwaysOnTop(true);
        setTitle("fist");
    }
}

class MyDialog2 extends JDialog {

    public MyDialog2() {
        super(null, ModalityType.MODELESS);
        setAlwaysOnTop(true);
        setTitle("second");
    }
}

public class ModalityIssue {

    private JFrame frame = new JFrame();
    private MyDialog1 d1 = new MyDialog1();
    private MyDialog2 d2 = new MyDialog2();

    public ModalityIssue() {
        frame.setTitle("third");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setLocation(100, 100);
        frame.setVisible(true);

        d1.setSize(400, 300);
        d1.setLocation(200, 200);
        d1.setVisible(true);

        d2.setSize(400, 300);
        d2.setLocation(300, 300);
        d2.setVisible(true);
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new ModalityIssue();
            }
        });
    }
}