如何在线程和 GUI 之间进行通信

2023-12-03

目前我使用 Kotlin 和 Java 开发桌面应用程序,GUI 是使用 JavaFX 制作的。 我有几个基本的 UDP 服务器(Kotlin 线程)监听不同的端口以通过网络接收数据。连接工作正常。

我可以想到几种(或多或少复杂的)线程和 GUI 控制器之间通信的方法,但我想知道是否有某种我根本不知道的默认方法。

我正在寻找一种简单的方法,将“消息”从线程发送到控制器,以便更改标签上的某些文本或类似的内容。


Use Platform.runLater

当不在 JavaFX 线程上时,使用Platform.runLater调用最终更新 GUI 的方法。

这样做将调度包含在中的代码runLater稍后在 JavaFX 应用程序线程上执行。

由于 JavaFX 系统被设计为单线程系统,因此这是使系统一致工作所必需的。

JavaFX 中更高级别的并发支持

JavaFX 还有更高级别的并发支持使用诸如Task通过以下方法提供一些通信支持updateMessage。在任务内的实现级别,updateMessage只是使用Platform.runLater内部,但在其实现中包含一些额外的优化,以使其使用简单且高效。

通常,Tasks 和 Platform.runLater 有不同的(有时是互补的)焦点,请参阅Javafx:javafx.concurrent 和 Platform.runLater 之间的区别?.

特别是,对于 UDP 服务器在多个端口上侦听并将信息反馈给 GUI 的要求,可能会调用runLater直接是比使用 JavaFX 任务更合适的解决方案。

附加问题的答案

但是绑定可能适用于我的情况

不要使用绑定、修改属性或从另一个线程触发更改侦听器而不将调用包装在Platform.runLater call.

绑定和更改侦听器不适用于多线程环境(例如,如果您同时修改不同线程上的绑定或更改侦听器,结果可能是不可预测的)。另外,如果您的绑定或更改侦听器最终触发 JavaFX 应用程序线程对活动场景图的更改,则结果可能再次无法预测,因为场景图并非设计用于以这种方式使用。

目前我不知道应该如何使用 runLater(),因为我无法从线程类访问相关的 GUI 元素。

一些不同的选择:

  1. 向线程类提供对 GUI 元素的访问,因此它可以在runLater致电(这是对您的设计修改)或
  2. 让线程类调用另一个类上的方法(通过runLater)它确实了解 GUI 元素并可以进行适当的更改或
  3. 使用具有可观察属性的共享模型类,您已将其附加到已建立绑定或更改侦听器的控制器类,以根据属性的更改来更新 UI。从你的线程你应该read(有关从 GUI 线程到另一个线程进行通信的方法,请参阅链接)并使用将可观察属性写入共享模型类runLater.

正如你所看到的,在所有情况下,最终runLater用于调度涉及稍后在 JavaFX 线程上运行的 GUI 的工作,以强制系统内的线程安全。在所有情况下,如果您无法直接访问 GUI 元素,则需要与可以直接访问 GUI 元素的东西进行通信,以便它可以代表您进行任何必要的修改。

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

如何在线程和 GUI 之间进行通信 的相关文章

  • 如何将 JSpinner 的值设置为特定日期

    我有一个JSpinner我添加到JPanel我想将其时间设置为 GregorianCalendar calendar JSpinner spinner new JSpinner spinner setModel model pom add
  • 单元测试组合服务方法

    我正在为一个类编写 junit 单元测试 该类使用以下方法实现公开的接口 public Set
  • 如何在log4j的配置文件中为文件附加器提供环境变量路径

    我有一个log4j xml配置文件 和一个RollingFileAppender我需要提供用于存储日志的文件路径 问题是我的代码将作为可运行的 jar 部署在 Unix 机器上 所以如果我传递这样的参数 value logs message
  • 如何提取文件 jre-9/lib/modules?

    In JRE 9 lib目录 至少在 Windows 上 有一个名为modules其大小约为107 MB 是否可以提取该文件或在其中列出 java 模块 我可以看到一个名为jmod可以在jdk 9 bin jmod exe 但那是为了阅读
  • 如何在Java中优雅地处理SIGKILL信号

    当程序收到终止信号时如何处理清理 例如 我连接到一个应用程序 希望任何第三方应用程序 我的应用程序 发送finish注销时的命令 发送该信息最好说什么finish当我的应用程序被破坏时的命令kill 9 编辑1 kill 9无法被捕获 谢谢
  • 尝试写一个无锁的单链表,麻烦去除

    我正在尝试编写一个无锁单链表 最终一致性不是问题 有人遍历可能包含不正确项目的列表 我认为我正确添加了项目 循环和Interlocked CompareExchange 但我不知道如何删除节点 列表中的任何位置 因为我必须获取前一个项目并设
  • JTextField 和 JTextArea

    JTextField 和 JTextArea 有什么不同 是否可以在一个班级中使用这两个班级 总之 JTextField 是单行文本字段 而 JTextArea 可以跨越多行 文档中清楚地解释了这些差异 文本区 http docs orac
  • Kafka Java Consumer 已关闭

    我刚刚开始使用卡夫卡 我面临着消费者的一个小问题 我用Java写了一个消费者 我收到此异常 IllegalStateException 此消费者已关闭 我在以下行中遇到异常 ConsumerRecords
  • 需要正则表达式帮助

    我正在尝试替换两次或多次出现的 br like br br br 标签与两个一起 br br 具有以下模式 Pattern brTagPattern Pattern compile lt s br s s gt s 2 Pattern CA
  • 当 JMS Prod 位于辅助 POJO 类中时,如何在事务中包含 JMS Producer

    简短的问题 有没有办法强制无状态 EJB 调用的 POJO 存在于 EJB 的上下文中 以便事务和资源注入可以在 POJO 中工作 具体来说 在我想要做的事情的上下文中 如何在 EJB 的事务中包含 POJO JMS 生产者 该生产者在调用
  • 将现有 eclipse 项目导出到 war 文件时出现“模块名称无效”

    我正在尝试将现有 Eclipse 项目导出到 war 文件 但无论我在 WAR Export 对话框页面中输入什么 系统总是返回 模块名称无效 我不知道如何解决这个问题 谢谢您的帮助 我有同样的问题 我修复了它 请按照以下步骤操作 您可以创
  • 是否有最新的 Facebook Java SDK? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 好像没找到最近更新的 如果没有 是否有一个好的 Java 库来执行与 Facebook 的 API 交
  • 从 Android 访问云存储

    我一直无法找到任何有关如何从 Android 应用程序使用云存储的具体文档 我确实遇到过这个客户端库 https cloud google com storage docs reference libraries然而 Google Clou
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • 配置jmxremote时无法正常停止tomcat

    我添加了一个jmxremotecatalina bat中的配置 set JAVA OPTS Dcom sun management jmxremote port 9004 Dcom sun management jmxremote ssl
  • 在循环中按名称访问变量

    我正在开发一个 Android 项目 并且有很多可绘制对象 这些绘图的名称都类似于icon 0 png icon 1 png icon 100 png 我想将这些可绘制对象的所有资源 ID 添加到整数 ArrayList 中 对于那些不了解
  • android 中的 java.net.URL ..新手问题

    我是java新手 正在尝试android开发 以下代码生成 malformedURLException 有人可以帮助我识别异常吗 任何提示都会非常有帮助 package com example helloandroid import and
  • 如何将库添加到 LIBGDX 项目的依赖项 gradle

    一切都在问题中 我已经尝试了在 SO 和其他网站中找到的所有答案 但没有运气 这就是我迄今为止尝试过的 adding compile fileTree dir lib include jar 到我的 build gradle adding
  • java中的预增量/后增量

    有人可以帮助我理解为什么 int i 1 int j 1 int k 1 int l 1 System out println i i System out println j j System out println k k System
  • 为什么我不能将 Collection 转换为 Collection>

    问题的关键是 为什么这会导致编译时错误 List

随机推荐

  • PhpMyAdmin 安装错误

    我刚刚在 Linux Fedora 13 上使用 PHP 5 3 3 安装了 phpmyadmin 我收到以下 2 个错误 首先 我在登录屏幕上看到以下内容 无法加载 mcrypt 扩展 请 检查你的 PHP 配置 我在 google 上搜
  • Python-从长时间运行的子进程读取输出[重复]

    这个问题在这里已经有答案了 使用 subprocess 模块 Python 2 7 我正在运行命令并尝试在运行时处理其输出 我有如下代码 process subprocess Popen udevadm monitor subsystem
  • svn:switch 不能与相对的 svn:external 一起使用吗?

    我们有一个相对 svn external 的子文件夹 project subfolder 在新的主干结帐中 它指向 TRUNK project subfolder 在新的分支结帐中 它指向 BRANCH branchName project
  • AJAX JQUERY 相关:- 如何在 ajax 加载的页面上调用 ajax

    假设我通过 AJAX 调用搜索 现在我想在页面上调用另一个AJAX 该AJAX将由AJAX加载并且可以编辑
  • 使用 iText 获取 PDF 文件中的图像 DPI

    我正在尝试获取有关通过 iText 使用 Java 保存到 PDF 文件中的扫描图像的信息 Using 答案和评论 我得到了宽度和高度 通过 Matrix 或通过 BufferedImage 我们的想法是使用answer这里计算DPI 但我
  • 用贝塞尔曲线绘制圆弧

    我正在尝试使用贝塞尔曲线绘制圆弧 我了解到 您无法使用贝塞尔曲线绘制完美的圆 但您可以接近 不幸的是 数学太复杂了 我个人无法弄清楚 我可以将下面的 A1 切片创建为三角形 但我不知道如何确定控制点 另外 如果我尝试沿相反方向从圆中绘制一个
  • Google Docs API - 更新链接表

    我正在尝试使用新的 API 更新 Google 文档中的表格 表格是从 Google Sheet 链接的 我尝试了谷歌云中的API资源管理器 我能够提取 json 格式的文档 然后过滤掉表格 但在表 json 结构中 我没有找到任何可以更新
  • Python:从同一个解释器同时执行多个脚本

    我有一个蟒蛇脚本 再次执行4 5个Python脚本 出于性能原因 我想使用相同的解释器来执行所有脚本 我该如何处理这个问题 明显的解决方案 可能需要一些调整 是仅从主脚本调用每个脚本的主函数 例如 如果 script1 py 包含 usr
  • 关于 Web 应用程序端口的困惑

    我有一个已经深入开发的项目 并且端口存在问题 客户端是用骨干编写的 SPA 使用 Sails 作为服务器 问题在于 Client 在 Express 中运行在端口 80 上 而 Sails 在端口 1337 上运行 我想在 Sails 内托
  • powershell cmdlet 始终输出一个表,其列可由用户选择

    如果下面只有 4 列 我会得到一个可以通过 select 进一步修剪的表格 但如果我添加更多字段 输出就会变成一个列表 如何使其始终成为一个表而不破坏后续的选择Format table做 初始表将来自 cmdlet 用户将执行后续选择返回一
  • 为什么不将函数参数存储在 XMM 向量寄存器中?

    我目前正在阅读一本书 计算机系统 程序员的视角 我发现 在 x86 64 架构上 我们仅限于 6 个整数参数 这些参数将传递给寄存器中的函数 接下来的参数将在堆栈上传递 此外 前最多 8 个 FP 或向量参数在 xmm0 7 中传递 为什么
  • 如何检测 React 应用程序中动态生成的元素外部的点击?

    我一直在与 SPA 合作React 18 and 电影数据库 TMDB API 我目前正在研究搜索功能 有一个搜索结果列表 如下所示 为了在这个列表上有一个漂亮的滚动条 我使用React Perfect 滚动条 当我点击列表外部时 我需要该
  • 为什么 Jetty 使用 text/html 内容类型提供 css

    我在 Scalatra 应用程序中使用嵌入式 Jetty 服务器 问题是它服务css文件与text html内容类型 这是主要方法 package yard web import org eclipse jetty server Serve
  • 如何在 Javascript 中获取嵌套数组的长度?

    我有一个嵌套数组的示例 var testArray 1 2 3 4 5 6 7 8 9 10 11 12 这是我获取嵌套数组长度的函数 Array prototype getLength function var sum 0 functio
  • 如何正确使用 postMessage 通过 html5 和现代浏览器进行跨域消息传递?我仍然收到错误

    我确信这里出了问题 但我不能完全指出它 这个例子here表现良好 控制台上没有任何通知或错误 因此这意味着我的浏览器支持使用 html5 进行跨域消息传递 当然是这样 它是 Chrome 14 我的代码或多或少执行以下操作 WebsiteA
  • 使用路由器 1.3.0 部署多个流时出错

    我在 1 3 0 版本上遇到以下问题 xd gt stream create test1 definition http 路由器 script file tmp file1 groovy deploy 这部署得很好 xd gt stream
  • 删除/隐藏card.io/paypal徽标android

    我正在将 Card io 集成到我的 Android 应用程序中 并且我想删除 paypal 徽标 我搜索了stackoverflow并了解了EXTRA USE CARDIO LOGO的用法 将此设置为 true 或 false 显示 Pa
  • Python:UnicodeDecodeError:'utf8'编解码器无法解码字节0x91 [关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我正在解析 CSV 如下所示 with open args csv rU as csvfile try reader csv DictReader csvfile dialect csv
  • ggplot2 中轴接触处缺少像素

    我注意到 ggplot2 在 x 轴和 y 轴之间留下了一个小间隙 考虑以下代码 require ggplot2 quietly TRUE axisLines element line color black size 2 p ggplot
  • 如何在线程和 GUI 之间进行通信

    目前我使用 Kotlin 和 Java 开发桌面应用程序 GUI 是使用 JavaFX 制作的 我有几个基本的 UDP 服务器 Kotlin 线程 监听不同的端口以通过网络接收数据 连接工作正常 我可以想到几种 或多或少复杂的 线程和 GU