gpt4 book ai didi

java - JOptionPane.showMessageDialog 和 swing.utils.invokeAndWait 的(事件调度)线程安全用法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:45:06 25 4
gpt4 key购买 nike

我有一个简单的 groovy 脚本,从它的主线程执行需要向用户显示一些对话框。

我的 Swing 知识有限且生疏,但我记得读过有关需要小心将 GUI 内容保留在事件调度线程 (EDT) 上的内容。

如果我只是从我的主线程调用静态JOptionPane.showMessageDialog 方法,我假设这会违反将 GUI 内容保留在 EDT 上的正确做法是否正确?

我真的应该像下面的示例代码那样使用 swing.utils.invokeAndWait 方法吗?


void showHelloThereDialog()
throws Exception {
Runnable showModalDialog = new
Runnable() {
public void run() {
JOptionPane.showMessageDialog(
myMainFrame, "Hello There");
}
};
SwingUtilities.invokeAndWait
(showModalDialog);
}

现在,在 invokeAndWait 完成后,除了消息对话框之外,上面的内容没有做任何事情来使值可用。

据推测,groovy 的“闭包”实现 Runnable 将使代码比上面的代码更简单。

是否需要 invokeAndWait?如果是的话,有人会给出一个正确实现的例子来获得类似使用 groovy 的 confirmDialog 的结果吗?

最佳答案

JOptionPane 的 showXXXDialog() 之一的调用是阻塞的,直到用户选择确定/取消/等等。一般来说,您通常不会在事件调度线程 (EDT) 上放置如此缓慢的阻塞指令,因为每个其他 GUI 组件都会卡住。所以,不把它放在 EDT 上的直觉是好的,但这也是错误的。原因如其他一些人所说,该方法创建 GUI 组件,这应该始终在 EDT 上完成。但是阻塞呢?您会注意到,即使您确实在 EDT 上运行它,它也能正常工作。原因在源代码里面找到了。 JOptionPane 类创建一个 Dialog 对象,然后调用 show(),然后调用 dispose(),第一个是阻塞线程的。如果您阅读评论(或 javadoc),您会看到它是这样描述该方法的:

If the dialog is modal and is not already visible, this call will not return until the dialog is hidden by calling hide or dispose. It is permissible to show modal dialogs from the event dispatching thread because the toolkit will ensure that another event pump runs while the one which invoked this method is blocked.

因此,在 EDT 上运行 JOptionPane 是绝对安全的,尽管它会阻塞。显然,在 EDT 之外调用 Dialog 的 show() 方法是安全的,但对于 JOptionPane 来说并非如此,因为它的方法正在创建 GUI 组件、添加监听器、访问其他组件模态和阻塞输入时的容器等。您不希望所有这些都在 EDT 之外完成,因为它不是线程安全的并且可能存在问题。不可否认,在 EDT 之外使用 JOptionPane 时,我从未见过问题,因此可能性似乎很低,但它们肯定是可能的。为对话框的容器传递一个 null 并只给不可变的对象(如 Strings)作为字段的参数将显着减少(据我所知甚至可能消除)发生错误的可能性之所以发生,是因为所有相关的 GUI 组件都是在同一个线程中创建和访问的,而它们是不可见的。但是,你应该只是安全并将它放在 EDT 上。调用 SwingUtilities.invokeAndWait() 并不难。

关于java - JOptionPane.showMessageDialog 和 swing.utils.invokeAndWait 的(事件调度)线程安全用法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5491952/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com