Java 如何在对话框可见时更改其模态
我有一个Java 如何在对话框可见时更改其模态,java,swing,jdialog,modality,Java,Swing,Jdialog,Modality,我有一个JDialog,我将其模态设置为无模型。但是,现在我需要在它可见时修改它的模态。但我知道Swing不允许在对话框可见时更改其模态。那么,有没有其他的技巧或代码可以做到这一点呢?只需按照。。。隐藏并显示对话框 注意:在隐藏并再次显示之前,更改可见对话框的模式可能不会产生任何效果 下面是一个有效的例子: public class ModalDialogTest { public static void main(String[] args) { SwingUtilit
JDialog
,我将其模态设置为无模型。但是,现在我需要在它可见时修改它的模态。但我知道Swing不允许在对话框可见时更改其模态。那么,有没有其他的技巧或代码可以做到这一点呢?只需按照。。。隐藏并显示对话框
注意:在隐藏并再次显示之前,更改可见对话框的模式可能不会产生任何效果
下面是一个有效的例子:
public class ModalDialogTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame ();
final JDialog dialog = new JDialog(frame);
dialog.setModal(true);
Runnable modalSwitcher = new Runnable() {
@Override
public void run() {
try {
System.out.println("Worker thread: sleeping for 5 seconds");
Thread.sleep(5000);
System.out.println("Worker thread: sleeping finished!");
} catch (InterruptedException ex) {
// this thread is not interrupted
}
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
System.out.println("ENTERING MODALSWITCHER!");
dialog.setModalityType(ModalityType.MODELESS);
dialog.setVisible(false);
dialog.setVisible(true);
System.out.println("NO LONGER MODAL!");
}
});
}
};
new Thread(modalSwitcher).start();
System.out.println("DIALOG WILL NOW SHOW UP:");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
dialog.setVisible(true);
System.out.println("BYE!");
}
});
}
}
5秒后,您将能够单击父JFrame
这是程序打印的内容:
DIALOG WILL NOW SHOW UP:
Worker thread: sleeping for 5 seconds
Worker thread: sleeping finished!
ENTERING MODALSWITCHER!
NO LONGER MODAL!
BYE!
在显示对话框时,您是否真的想继续切换模态的实践取决于您,但从用户体验的角度来看,我不建议您这样做-这感觉相当奇怪 更新对话框并在其上调用
repaint()
。如果您已经更改了层次结构(添加/删除了组件),那么不要忘了revalidate()
除了按照JavaDoc所说的操作(即再次隐藏和显示对话框)之外,可能没有其他技巧。主要问题是:你为什么要这样做?在显示对话框之前,您不知道模态吗?当对话框突然变成模态时,用户应该如何处理被某个窗口(可能也是模态)隐藏的对话框?@Thomas,实际上我遇到了一个对话框,其中有一个文本字段。我设置了此文本字段的默认焦点。但是,当我的对话框是模态的时候,它就可以正常工作了。但是,当我的对话框是无模式的时,焦点在打开对话框后不会自动到达文本字段,所以问题是对话框没有获得或失去焦点?然后我会处理这个问题,而不是使对话框成为模态。@Thomas,dialog没有获得焦点OK,然后正如我所说的,尝试解决这个问题,而不是努力解决这个问题(顺便说一句,你确定对话框没有获得焦点,并且由于其他组件的请求而立即失去焦点吗?。repaint()
evaluateDialog.modalityType
?我不明白为什么这个答案被如此高估。repaint()
没有重新评估对话框模态的效果。您甚至不能在JDialog上调用revalidate()
。人们是盲目地向上投票还是什么?