JavaFX 的 Swing 计时器替代方案以及线程管理差异

2024-04-29

使用 JavaFX 的 Swing 计时器是否安全,或者 Swing 有特殊的替代方案吗? JavaFX 和 Swing 的线程管理有什么区别?

事实上我很想知道相当于摇摆计时器, SwingUtilities.invokeLater() and invodeAndWait()对于 JavaFX。

顺便问一下,如果我们在 JavaFX 中使用一些 Swing 组件怎么办?我们应该使用两个并行的计时器/线程来更新这些组件吗?


JavaFX 相当于SwingUtilities.invokeLater()

Platform.runLater(java.lang.Runnable runnable)

也可以看看JavaFx 对 SwingUtilities.invokeLater 的响应 https://stackoverflow.com/questions/12984310/javafx-response-to-swingutilities-invokelater.

JavaFX 相当于invokeAndWait()

公共 JavaFX API 故意不在 Platform.runLater 上公开 invokeAndWait 调用,因为它很容易使您自己陷入僵局,因此只要您确切知道自己在做什么,就可以使用下面的代码。

final FutureTask query = new FutureTask(new Callable() {
    @Override
    public Object call() throws Exception {
        return queryPassword();
    }
});
Platform.runLater(query);
System.out.println(query.get()); // the get blocks until the query FutureTask completes.

也可以看看javafx平台runlater返回结果 https://stackoverflow.com/questions/13796595/return-result-from-javafx-platform-runlater.

JavaFX 相当于javax.swing.Timer.

Use a Timeline http://docs.oracle.com/javafx/2/api/javafx/animation/Timeline.html。以下代码将更新每秒显示日期的标签:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Label dateLabel = new Label();
Timeline timeline = new Timeline(
    new KeyFrame(
      Duration.ZERO,
      actionEvent -> dateLabel.set(dateFormat.format(new Date()))
    ),
    new KeyFrame(
      Duration.seconds(1)
    )
);
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();

另请参阅基于时间轴的答案如何在java fx中每2秒更新一次标签框? https://stackoverflow.com/a/16138351/1155209.

如果我们在JavaFX中使用一些Swing组件呢?我们应该使用两个并行的计时器/线程来更新这些组件吗?

我认为不是,取决于应用程序,但通常应用程序的单个计时器是首选。这是一个特殊的案例。通常,如果您在计时器上发生一些异步进程,您希望它同时发生,因此计时器会触发,进行一些处理,然后将结果分流回 GUI。当您混合两个 UI 框架时,情况会稍微复杂一些,因为您希望同时或在同一渲染帧内更新两个框架的结果。

为了近似这个,我建议只使用一个简单的java.util.Timer http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html,而不是一个javax.swing.Timer http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html,或使用预定执行服务 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ScheduledExecutorService.html如果您需要更多灵活性。然后,在定时任务 http://docs.oracle.com/javase/7/docs/api/java/util/TimerTask.html或预定的Runnable http://docs.oracle.com/javase/7/docs/api/java/lang/Runnable.html,执行您的处理逻辑,并在处理完成后调用 Platform.runLater并分别SwingUtilities.invokeLater 根据需要将结果分流回 JavaFX 或 Swing 组件。

当然,您应该考虑混合这样的两个框架并处理潜在的线程复杂性是否值得。如果您能够仅使用单个框架并依赖最适合该框架的并发方法,我认为这将是首选方法。

JavaFX 和 Swing 的线程管理有什么区别?

从用户的角度来看,它非常相似。 JavaFX 和 Swing 仍然是应用层 UI 处理的单线程框架。 JavaFX 的所有用户代码都在 JavaFX 应用程序线程上运行。此外,任何可能修改活动场景图(舞台上显示的节点)的代码都必须在 JavaFX 应用程序线程上运行。这些规则类似于 Swing 编程中线程管理的本质。

默认情况下,JavaFX 应用程序线程和 Java 8 初始版本中的 Swing 线程是不同的。所以:

  1. 要从 JavaFX 应用程序线程更新 Swing 组件,请使用Platform.runLater将处理从 JavaFX 线程切换到 Swing 线程。
  2. 要从 Swing 线程更新 JavaFX 节点,请使用SwingUtilities.invokeLater将处理从 Swing 线程切换到 JavaFX 线程。

Java 平台的未来版本可能会为 Swing 和 JavaFX 提供统一的应用程序线程。

请注意,Swing 和 JavaFX 库代码中使用的内部线程实现有所不同。 JavaFX 将使用不同的硬件和软件渲染管道,这些管道可以在自己的线程上运行。然而,这个内部实现细节对应用程序程序员是完全隐藏的。

参考文档

JavaFX 教程中的并发 http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm由甲骨文公司。特别是,请参阅有关Task http://docs.oracle.com/javafx/2/api/javafx/concurrent/Task.html and Service http://docs.oracle.com/javafx/2/api/javafx/concurrent/Service.html用于管理 JavaFX 的后台操作,本答案中未明确讨论的主题。

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

JavaFX 的 Swing 计时器替代方案以及线程管理差异 的相关文章

  • 何时分离或加入 boost 线程?

    我有一个方法 大约每 30 秒触发一次 我需要在一个线程中包含它 我有一个可以从类外调用的方法 像 call Threaded Method 这样的东西会创建一个线程 该线程本身会调用最终的线程方法 这些是 MyClass 的方法 void
  • XCode std::thread C++

    对于学校的一个小项目 我需要创建一个简单的客户端 服务器结构 它将在路由器上运行 使用 openWRT 并且我试图在这个应用程序中使用线程做一些事情 我的 C 技能非常有限 所以我在internet https stackoverflow
  • 线程安全的有限大小队列,不使用锁

    我正在尝试编写一个主题队列 但遇到死锁和其他多线程问题 我想用Interlocked CompareExchange避免lock用法 但这段代码并没有按预期工作 它只是擦除整个队列 我在这里做错了什么 public class FixedS
  • C++11 非阻塞生产者/消费者

    我有一个 C 11 应用程序 其中有一个生成数据的高优先级线程和一个消耗数据的低优先级线程 在我的例子中 将其写入磁盘 我想确保高优先级生产者线程永远不会被阻塞 即它仅使用无锁算法 使用无锁队列 我可以从生产者线程将数据推送到队列 并从消费
  • 多线程 Web 应用程序

    我知道有很多情况都是在应用程序中使用多线程的好例子 但是什么时候最好在 net Web 应用程序中使用多线程 Web 应用程序几乎肯定已经由托管环境 IIS 等 实现多线程化 如果您的页面受 CPU 限制 并且想要使用多个核心 那么可以说多
  • 如何在Netbeans中设置JList的ListModel?

    我在 Netbeans IDE 的帮助下设计了一个 Swing GUI 该 GUI 包含一个 JList 默认情况下 它使用 QAbstractListModel 将其作为 JList 构造函数中的参数传递以创建该 JList 我想在 Ne
  • 异步调用的任务限制?

    我有一个同步工作的 NET 4 5 WCF 客户端 我正在更新它以使用新的异步 等待功能来进行多个同时服务器调用以同时获取数据块 在结束之前 我担心同时运行的所有线程将使服务器饱和 更不用说明年升级到该角色时会终止我的 Azure 辅助角色
  • 从另一个线程调用线程中的方法,python

    如何实现线程之间的通信 我有一个线程在其中执行一些操作 然后我需要从位于主程序线程中的对象调用一个方法 并且该方法应该在主进程中执行 class Foo def help self pass class MyThread threading
  • Java - 文本字段上的占位符

    我正在尝试使用 Swing 创建一个 GUI 我的问题是 我有一个文本字段 但我希望它有一个 占位符 就像在 html 中一样 我在这里和那里读到它可以通过覆盖文本字段的paint 来完成 由于我的代码已生成 我发现我需要使用 自定义创建代
  • 运行单个 Java 线程的双核 CPU 利用率[重复]

    这个问题在这里已经有答案了 可能的重复 多线程 Java 应用程序能否很好地利用多核机器 https stackoverflow com questions 1649402 would a multithreaded java applic
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • 向 JList 添加滚动条? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何将 JList 添加到 JScrollPane 把你的JList in a JScrollPane JScrollPane scrol
  • Java检测鼠标长按

    如果用户按下 JList 组件超过 3 秒 有什么方法可以捕获事件吗 我发现困难的部分是即使在用户松开鼠标左键之前也需要触发事件 这可以通过 mousePressed 和 mouseReleased 组合轻松完成 您可以在 mouseDow
  • 如何停止抖动中的计时器?

    我在 flutter 中创建了一个计时器 一切正常 现在我不知道如何在启动计时器后关闭它 文档说你可以通过调用取消它void cancel 但我不明白其实现 我该怎么称呼它 这是正确的方法吗 static const timeout con
  • Parallel.ForEach - 优雅取消

    关于等待任务完成和线程同步的主题 我目前有一个迭代 我已将其包含在 Parallel ForEach 中 在下面的示例中 我在评论中提出了一些关于如何最好地处理循环的优雅终止的问题 NET 4 0 private void myFuncti
  • 文档过滤器在 Java 中不起作用?

    在超过 10 个字符的文本字段中 它必须显示错误 为此 我使用了文档过滤器 JTextField field JTextField txtFld AbstractDocument document AbstractDocument fiel
  • Swing - 是否可以在 JTable 单元格中设置“特定”文本的字体颜色?

    我有一个 JTable 其中一列按以下格式显示值 423545 50 7568787 50 53654656 2021947 50 021947 2021947 50 8021947 50 我想知道是否可以用红色显示方括号内的值 在过去的几
  • 线程池的 lambda 函数内的编译器错误变量“未捕获”

    我正在学习 C 中的多线程 并尝试设置线程池 但收到编译器错误 提示 错误 未捕获 mapperNodes 和 错误 未捕获 command 我读过一些关于使用 this 捕获 lambda 中的变量的内容 但到目前为止没有任何效果 如何在
  • 如何解决 onEditCommit 事件上的类型不匹配错误?

    我在 Fxml 中使用 onEditCommit 事件在用户编辑数据后检索数据 FXML 代码
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一

随机推荐