如何在对话框可见时更改其形式

时间:2016-02-25 08:42:20

标签: java swing jdialog modality

我有一个JDialog,我将模态设置为较少的模型。但是,现在我需要在可见时修改其模态。但我知道Swing不允许在对话框可见时更改对话框的模态。那么,有没有其他技巧或代码可以做到这一点?

2 个答案:

答案 0 :(得分:3)

只需执行Javadoc所说的内容...隐藏并显示对话框。

  

注意:更改可见对话框的模态可能无效,直到它被隐藏然后再次显示。

所以这是一个有效的例子:

UICollectionView

5秒后,您就可以点击父JFrame。

这是程序打印的内容:

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!");
            }
        });
    }
}

你是否真的想在显示对话框的同时继续进行切换模态的练习取决于你,但我不建议从用户体验的角度来看 - 这感觉很奇怪。

答案 1 :(得分:-1)

更新对话框并在其上调用repaint()。如果您更改了层次结构(添加/删除了组件),请不要忘记revalidate()