如何使用 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
来完成这个。
否则,您必须使用某种并发原语(wait
和 notify
、Condition
等)才能让线程调用 showModal
等到事件returns。不过,invokeAndWait
已经为您实现了这一点,所以它应该可以工作。
我正在尝试从另一个线程创建自定义阻塞模式,但不明白如何去做。这是我的模态:
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
来完成这个。
否则,您必须使用某种并发原语(wait
和 notify
、Condition
等)才能让线程调用 showModal
等到事件returns。不过,invokeAndWait
已经为您实现了这一点,所以它应该可以工作。