我有以下代码示例:
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的逻辑是什么?
答案 0 :(得分:0)
不,它没有。 Swing中没有任何东西阻止任何线程 - 尽管所有处理,布局和JComponent
结构的更改等都必须在Swing线程上发生。
通常在这方面创建一个全新的窗口是安全的,但仍然值得在摇摆EDT上创建您的孩子(使用invokeLater
)。