gpt4 book ai didi

java - Swing 对话框如何工作?

转载 作者:太空狗 更新时间:2023-10-29 22:35:08 25 4
gpt4 key购买 nike

如果您在 Swing 中打开一个对话框,例如 JFileChooser,它会有点像这样的伪代码:

swing event thread {  create dialog  add listener to dialog close event {    returnValue = somethingFromDialog  }  show dialog  (wait until it is closed)  return returnValue}

我的问题是:这怎么可能行得通?如您所见,线程等待返回,直到对话框关闭。这意味着 Swing 事件线程被阻塞。然而,人们可以与对话框交互,AFAIK 需要此线程运行。

那么它是如何工作的呢?

最佳答案

现有的事件派发线程被阻塞,因此 swing 创建了另一个线程来发送事件。这就是对话期间的事件调度线程。

Swing 创建了一个单独的 native 线程来发送 native 操作系统窗口消息。这与 AWT 事件线程是分开的。

在 Windows 上,您会看到这些线程

  "AWT-Windows"   - the native UI thread
"AWT-EventQueue-0" - the current AWT event dispatch thread

编辑:否决票是正确的。这不是真的,至少不是在所有情况下。

模态对话框通常会自行处理 AWT 事件。如果你运行代码

SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
JOptionPane.showInputDialog("hello");
}
});

然后中断,查看线程,您将看到只有一个 EventQueue 线程。 JOptionPane 的 show() 方法自行抽取事件。

类似 Spin 的框架和 Foxtrot 采用相同的方法 - 它们允许您在 EDT 上创建一个长时间运行的阻塞方法,但通过抽取事件本身来保持事件流动。 swing 可能有多个调度线程(我敢肯定旧版本的 swing 就是这种情况)但是现在多核很常见,并发问题,特别是确保一个线程上的更改正确发布到其他线程,意味着使用多个 EDT 会在当前实现中产生错误。看 Multiple Swing event-dispatch threads

关于java - Swing 对话框如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028842/

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