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()
evaluate
Dialog.modalityType
?我不明白为什么这个答案被如此高估。
repaint()
没有重新评估对话框模态的效果。您甚至不能在JDialog上调用
revalidate()
。人们是盲目地向上投票还是什么?