【问题标题】:Issue with Dialog Modality in Swing in java 1.6java 1.6 中 Swing 中的对话框模式问题
【发布时间】:2016-01-09 11:19:15
【问题描述】:

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

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

现在的问题是:

  1. 理想情况下,当使用APPLICATION_MODAL 属性打开“第三个”对话框时,其他JComponent 不应接受单击。这适用于 java 1.7。
  2. 在 java 1.6 中,我单击对话框“一”,然后对话框“第二”位于对话框“一”的后面。而“第三个”对话框仍处于打开状态。

现在的问题是:

  • 当打开了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);
    }
    }

【问题讨论】:

  • 因为有awt.Frame

标签: java swing modal-dialog jdialog


【解决方案1】:
  • 不要使用awt组件

  • JFrame 忽略 alwaysOnTop 和模态,

  • 使用初始线程,

  • 代码排序也很重要

  • 您可以使用应用程序模式(似乎更好,但没有人知道是否符合您的要求)

  • MyDialog1 总是闪烁(MyDialog2 在 MyDialog1 之前绘制,然后跳到 MyDialog2,标准用户无法捕捉到),可能没有任何 JComponents 添加到当前 JVM 中的任何顶级容器中

例如(Java 1.6.21 / 025 / 031,在 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();
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 2011-04-22
    • 2011-10-09
    • 1970-01-01
    • 2012-01-30
    相关资源
    最近更新 更多