如何使用 SwingUtilities.invokeLater 调用阻塞模式

How to make a blocking modal invoked with SwingUtilities.invokeLater

我正在尝试从另一个线程创建自定义阻塞模式,但不明白如何去做。这是我的模态:

public class BlockingModal extends JDialog {
    private BlockingModal view;
    public BlockingModal(JFrame parent) {
        super(parent);
        this.setModal(true);
    }

    public void showModal() {
        BlockingModal view = this;
        if (SwingUtilities.isEventDispatchThread()) {
            view.setVisible(true);
        } else {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    view.setVisible(true);
                }
            });
        }
    }
}

我希望我能够从另一个线程创建这个模态的新实例并简单地调用 myModal.showModal() 它。

但是,很明显,如果它是通过 invokeLater 调用的,那么它就不再阻塞了。

我正在尝试在大型非 EDT 代码库中创建一段新的 EDT 兼容代码。

像这样从另一个线程实现阻塞模式的最佳方法是什么?

你应该可以使用 invokeAndWait 来完成这个。

否则,您必须使用某种并发原语(waitnotifyCondition 等)才能让线程调用 showModal 等到事件returns。不过,invokeAndWait 已经为您实现了这一点,所以它应该可以工作。