当我们使对话框可见时,ModalityType.APPLICATION_MODAL是否阻止线程

时间:2015-12-10 09:46:29

标签: java multithreading swing jframe jdialog

我有以下代码示例:

import java.awt.GridLayout;
import java.awt.Window;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JPanel;
 class MyDialogParent extends JDialog {

     MyDialogParent ()
    {
        super(null,ModalityType.APPLICATION_MODAL);

    //    super.setUndecorated(true);
        super.setVisible(false);


        // Disable Alt-F4 and any other close key sequences (MMSmk90468).
        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    }
}

 class MyDialogChild extends JDialog {

     MyDialogChild (Window parent)
        {
         super(parent,ModalityType.MODELESS);
         setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setAlwaysOnTop(true);


        }
    }


public class MyDialogs {

    public static void main(String args[])
    {
        MyDialogParent parent=new MyDialogParent();
        parent.setSize(400, 400);

        parent.setVisible(true);
        System.out.println("1");
        System.out.println("2");
        System.out.println("3");

        MyDialogChild child=new MyDialogChild(parent);
        child.setLocationRelativeTo(parent);
        child.setSize(300, 300);
        child.setLayout(new GridLayout());
        child.add(new JPanel());

        child.setVisible(true);


    }
    }

现在执行挂起

  

parent.setVisible(真);

我知道ModalityType.APPLICATION_MODAL的概念阻塞了对某些顶级窗口的输入。

我认为只有子框架不会收到任何输入或焦点。在代码中我看到的不同。

我想知道它是如何工作的。就像线程在父框架可见后停止执行一样。它会进入某种等待状态吗?

与线程相关的各种ModalityType的逻辑是什么?

1 个答案:

答案 0 :(得分:0)

不,它没有。 Swing中没有任何东西阻止任何线程 - 尽管所有处理,布局和JComponent结构的更改等都必须在Swing线程上发生。

通常在这方面创建一个全新的窗口是安全的,但仍然值得在摇摆EDT上创建您的孩子(使用invokeLater)。