Swing 对话框如何工作?

2024-01-01

如果您在 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 事件线程被阻塞。然而,人们可以与对话框进行交互,据我所知,这需要该线程来运行。

那么它是如何运作的呢?


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

Swing 创建一个单独的本机线程来泵送本机操作系统窗口消息。这与 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");
    }
});

然后break,查看线程,你会看到只有一个EventQueue线程。 JOptionPane 的 show() 方法泵事件本身。

像这样的框架Spin http://spin.sourceforge.net/和 Foxtrot 采用相同的方法 - 它们允许您在 EDT 上创建长时间运行的阻塞方法,但通过泵送事件本身来保持事件流动。 swing 可能有多个调度线程(我确信旧版本的 swing 就是这种情况),但现在多核很常见,并发问题,特别是确保一个线程上的更改正确发布到其他线程,意味着使用多个 EDT 会在当前实现中产生错误。看多个 Swing 事件分派线程 https://stackoverflow.com/questions/859274/multiple-swing-event-dispatch-threads

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Swing 对话框如何工作? 的相关文章

随机推荐

  • info.plist 中添加的 NSLocationAlwaysUsageDescription 字符串未显示在权限弹出窗口 ios 中

  • 对于实时图形编程,C++ 的最佳替代方案是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Heroku 错误消息未检测到 Cedar 支持的应用程序

    因此 我在使用 heroku 和这个 Rails 教程时遇到了更多问题 我正在制作的 Rails 教程让我开发了一个超级基本的应用程序 然后他们让我创建一个比特桶帐户 之后他们让我创建了一个 Heroku 帐户 现在他们要求我推动我的起源大
  • Android Studio 2.x - 永远构建符号...

    我的 Android Studio 有问题 将 AS 更新到 2 2 后 需要很长 约 30 分钟 的时间来处理 表明它正在 构建符号 该项目相当大 并且包含 NDK 组件 使用 gradle 构建速度非常快 BUILD SUCCESSFU
  • 如何重构 XSD 以便解组不会返回 JAXBElement

    我有以下架构
  • 我可以使用 JavaScript fetch() 在 DOM 中插入内联 svg 吗?

    我有一个使用 XMLHttpRequest 在 DOM 中插入内联 svg 的函数 我想知道是否可以使用 fetch 执行相同的函数 其功能是 el document querySelector foo var request new XM
  • 使用 Boost 类型特征进行条件编译

    我有一个模板 我想根据参数的类型有条件地编译它 我只关心区分 普通旧数据 POD 即整数等或类 结构 我在 Windows 上使用 c VS2008 template
  • Testflight 无法识别新设备

    我正在尝试将用户添加到 Testflight 构建中 因此 我转到开发人员门户并添加他们的信息 UDID 和设备名称 并将他们的设备添加到配置文件中 重新下载并将其应用到项目中 然后我存档到 ipa 文件 然而 当我将 ipa 上传到 Te
  • 导轨捆绑清洁

    更新捆绑包后 您将拥有一些可能已过时的 gem 因为已安装该 gem 的较新版本 下没有这样的命令bundle可执行的 即bundle clean 如何摆脱这些过时的宝石 这是减少我的 Rails 应用程序中的 slug 大小的尝试 如果您
  • Kibana v 7.9.2 小时_分钟_秒的精确格式

    我跟着 and https www elastic co guide en elasticsearch reference current mapping date format html https www elastic co guid
  • ApplicationContext 事件从未被抛出

    我正在努力拥有ContextEventListener在所有 ContextXXXEvent 上 我为每个事件类型创建了一个侦听器 如下所示 ContextRefreshedEvent是一个例子 Component public class
  • 让一个函数“返回”超级函数?

    给出的是以下代码 function two return success function one two return fail 如果您通过调用函数 one 来测试代码 您将始终得到 失败 问题是 如何通过仅调用函数二 来在函数一 中返回
  • Textview 环绕 View [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我试图让我的水平布局充分利用可用的空间 在显示活动的信息中 我有一个 事实框 后面跟着一大框文本 我希望信息框向右浮动 类似于下图 使
  • 无需输入类名即可获取枚举?

    我注意到在 C 中 当我有一个 Enum 时 请说 class ClassObject public static Enum EventType Click Jump Etc 当我必须访问它时 我必须浏览它的主类 它非常冗长 例如 Clas
  • 将子菜单添加到 Visual Studio 项目项节点

    右键单击文件项 Visual Studio 解决方案资源管理器时如何添加菜单和子菜单项 我有一个菜单和三个子菜单项 当我右键单击解决方案资源管理器中的文件时 将显示这些菜单项 如下图所示 我尝试使用 vsct 按钮 但它将显示在上下文菜单上
  • 无法安装 MySQL-python

    我想在 python 2 7 虚拟环境中安装 MySQL python 但出现以下错误 Installing collected packages MySQL python Running setup py install for MySQ
  • 安卓:应用程序未安装

    这里是新手 我用Godot游戏引擎制作了我的第一个游戏并成功导出到android 复制到我的手机上 它安装并运行良好 几个小时后 我做了一些更改并再次导出 再次复制了 apk 但现在当我尝试安装它时 它没有完成安装 我多次尝试更改导出设置
  • 在 Android 上检测 wifi IP 地址?

    我需要确定Android设备是否连接到Wifi 如果是 则获取其Wifi IP地址 我知道如何使用 ConnectivityManager 来确定活动网络是否是 Wifi 网络 并且我知道如何使用 java net NetworkInter
  • Python 的 socket.getaddrinfo/mercurial 未使用持久 DNS 缓存

    当我通过一台调制解调器 ISP 连接时 我的 Ubuntu 机器上的 DNS 查找速度非常慢 我按照说明进行操作 例如here http aacable wordpress com 2011 06 13 ubuntu persistent
  • Swing 对话框如何工作?

    如果您在 Swing 中打开一个对话框 例如 JFileChooser 它有点类似于以下伪代码 swing event thread create dialog add listener to dialog close event retu