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

时间:2018-07-10 21:04:39

标签: java swing event-dispatch-thread

我正在尝试从另一个线程创建自定义阻止模式,但是不知道如何执行。这是我的模态:

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兼容代码。

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

1 个答案:

答案 0 :(得分:1)

您应该可以使用invokeAndWait

否则,您必须使用某种并发原语(waitnotifyCondition等)才能使调用showModal的线程等待直到事件返回。 invokeAndWait已经为您实现了此功能,因此它应该可以工作。