JavaFX 一次运行大量倒计时器?

2024-01-23

所以我可以看到几种不同的方法来完成我需要的事情,并且我已经做了很多谷歌/堆栈溢出搜索,但找不到我真正想要的东西。我需要运行多个“倒计时器”。我需要在不同时间同时运行大约 6 个(可能最多 10 个)倒计时器。我的主程序上有一个选项卡窗格,我在其中包含 FXML 并将控制器注入其中。计时器选项卡具有与主程序不同的控制器。

所以我的第一个问题是。由于此“选项卡”在单独的控制器上运行但包含在主程序中,因此它是否在单独的应用程序线程上运行?

以下是包含的选项卡 FXML 的示例...

当我按下每个开始按钮时。我可以创建一个Timeline and KeyFrame对于每个计时器。然而,我真的不认为这是最好的方法。特别是当您同时运行最多 10 个时间线时,并且绝对不是在与主程序不同的应用程序线程上运行。

我考虑过将每个启动请求发送到ExecutorService and newCacheThreadPool但是我需要能够使用当前剩余时间更新 GUI 上的标签,并且我知道您不应该使用后台服务来执行此操作。Platform.runLater() maybe?

另一个想法是使用Timer来自java.util.Timer班级。然而,我认为这与ExecutorService当我需要更新 GUI 标签时。我也明白,Timer该类仅创建一个线程并按顺序执行其任务。所以,那是行不通的。

或者,我应该有一个完整的其他“CountDown”类,我可以为每个类创建新实例,然后在其中启动新线程。但是,如果我这样做,我如何不断更新 GUI。我仍然需要使用 CountDown 类进行轮询timeline正确的?这样就违背了整件事的目的。


所以我的第一个问题是。由于此“选项卡”在单独的控制器上运行但包含在主程序中,因此它是否在单独的应用程序线程上运行?

不,只能有one每个 JVM 的 JavaFX 应用程序实例,以及one每个 JVM 的 JavaFX 应用程序线程。

至于如何更新计时器,可以使用Timeline- 每个计时器一个。Timeline不在单独的线程上运行 - 它由底层“场景图渲染脉冲”触发,负责定期更新 JavaFX GUI。拥有更多Timeline实例基本上只是意味着有更多的侦听器订阅“pulse”事件。

public class TimerController {
    private final Timeline timer;

    private final ObjectProperty<java.time.Duration> timeLeft;

    @FXML private Label timeLabel;

    public TimerController() {
        timer = new Timeline();
        timer.getKeyFrames().add(new KeyFrame(Duration.seconds(1), ae -> updateTimer()));
        timer.setCycleCount(Timeline.INDEFINITE);

        timeLeft = new SimpleObjectProperty<>();
    }
    public void initialize() {
        timeLabel.textProperty().bind(Bindings.createStringBinding(() -> getTimeStringFromDuration(timeLeft.get()), timeLeft));
    }

    @FXML
    private void startTimer(ActionEvent ae) {
        timeLeft.set(Duration.ofMinutes(5)); // For example timer of 5 minutes
        timer.playFromStart();
    }

    private void updateTimer() {
        timeLeft.set(timeLeft.get().minusSeconds(1));
    }

    private static String getTimeStringFromDuration(Duration duration) {
        // Do the conversion here...
    }
}

当然,你也可以使用Executor和其他线程方法,前提是您更新Label via Platform.runLater()。或者,您可以使用Task.

这是使用后台线程时的一般示例:

final Duration countdownDuration = Duration.ofSeconds(5);
Thread timer = new Thread(() -> {
    LocalTime start = LocalTime.now();
    LocalTime current = LocalTime.now();
    LocalTime end = start.plus(countDownDuration);

    while (end.isAfter(current)) {
        current = LocalTime.now();
        final Duration elapsed = Duration.between(current, end);

        Platform.runLater(() -> timeLeft.set(current)); // As the label is bound to timeLeft, this line must be inside Platform.runLater()
        Thread.sleep(1000);
    }
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaFX 一次运行大量倒计时器? 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 在画布上绘图

    我正在编写一个 Android 应用程序 它可以在视图的 onDraw 事件上直接绘制到画布上 我正在绘制一些涉及单独绘制每个像素的东西 为此我使用类似的东西 for int x 0 x lt xMax x for int y 0 y lt
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 我可以使用 HSQLDB 进行 junit 测试克隆 mySQL 数据库吗

    我正在开发一个 spring webflow 项目 我想我可以使用 HSQLDB 而不是 mysql 进行 junit 测试吗 如何将我的 mysql 数据库克隆到 HSQLDB 如果您使用 spring 3 1 或更高版本 您可以使用 s
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • 如何实现仅当可用内存较低时才将数据交换到磁盘的写缓存

    我想将应用程序生成的数据缓存在内存中 但如果内存变得稀缺 我想将数据交换到磁盘 理想情况下 我希望虚拟机通知它需要内存并将我的数据写入磁盘并以这种方式释放一些内存 但我没有看到任何方法以通知我的方式将自己挂接到虚拟机中before an O
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • 如何设置NSMenu/NSMenuItems的字体?

    我不知道如何在 NSMenu 中设置 NSMenuItems 的字体 样式 我在 NSMenu 上尝试了 setFont 方法 但它似乎对菜单项没有任何影响 NSMenuItem 似乎没有 setFont 方法 我希望它们都具有相同的字体
  • CSS 动画,单击时切换旋转

    我尝试让下面的插入符号在单击下拉菜单时旋转 180 度 在我尝试实现的解决方案中 它将插入符的类更改为单击时向上切换或向下切换 我第一次点击它时它会向上旋转 第二次它会立即返回到起始位置 然后再向上旋转 我闻到了脏代码的味道 添加此切换旋转
  • 在 ConstraintValidator 中注入服务 [Bean Validator - JSR 303] Spring

    下午好 我在 Bean Validator JSR 303 中注入服务时遇到问题 我将执行验证 但我需要验证数据库中的此记录 当我使用我的服务时 它抛出 NullPointerException 例外 Exception in thread
  • Ruby、RSVG 和 PNG 流

    我正在尝试在 Rails 应用程序中将图像从 SVG 转换为 PNG ImageMagick 不适合我 因为 Heroku 此时无法 想要升级 IM 我正在测试在开发中使用 RSVG2 Cairo 的一些想法 但遇到了障碍 我可以轻松地将
  • 将 ÆØÅ 等特殊字符读入 R (Rstudio)

    我正在尝试读取包含用挪威语编写的调查问卷数据的 CSV 文件 所以这个文件包含字母 但是 R 似乎不能很好地处理这些字母 它们都显示为问号 我用它来读取数据 data lt read csv2 Responser Vasket 20 06
  • 当我在 Visual Studio 2005 中保存文件时是否可以运行宏?

    当我在 Visual Studio 2005 中保存文件时 我希望还运行一个更新版权的宏 通过正则表达式搜索和替换 我对正则表达式并不陌生 但对 VB VBA 和 Visual Studio 宏很陌生 所以我具体需要帮助的是 让宏在保存时运
  • Java,具有同步方法的多线程

    有时我在让我的程序不陷入僵局时遇到一些麻烦 我想我需要添加第三个同步方法release 它可用于在调用ping后释放另一个线程 代码如下 Attempt at a simple handshake Girl pings Boy gets c
  • Angular - 模块没有导出成员“OpaqueToken”错误

    我应该如何解决这个错误 node modules ngrx store src ng2 d ts 1 10 中的错误 错误 TS2305 模块 C Users sandr Desktop wz r kopia node modules an
  • 开发了 strtok 替代品

    我开发了自己的 strtok 版本 只是为了练习指针的使用 任何人都可以看到这有任何限制 或者无论如何我可以改进 void stvstrtok const char source char dest const char token Sea
  • 许多控件的 Keydown 处理程序

    有没有更好的方法为繁忙表单上的许多控件提供按键处理程序 在某些情况下 单独使用表单处理程序是行不通的 Private Sub rText KeyDown ByVal Sender As Object ByVal e As KeyEventA
  • 将 NSInteger 转换为 NSUInteger?

    我正在尝试将 NSInteger 转换为 NSUInteger 我用 google 搜索了它 但没有找到真正的答案 我该怎么做 NSInteger and NSUInteger只是原始整数类型的 typedef if LP64 NS BUI
  • Google 脚本选择 Google 电子表格中的整行

    我想知道我们是否可以使用 Google 脚本在电子表格中选择一行 如下所示 无论如何 首先我尝试使用此功能来处理列 但我收到数据错误 未找到 如果您有一个想法 function testGetFullColumn getFullColumn
  • 为什么使用类而不是函数? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我确实知道类的一些优点 例如变量和函数作用域 但除此之外 对我来说 拥有一组函数似乎比拥有许多类的实例和抽象更容易 那么为什么将相似的函数分组在
  • 关于C++中const指针的问题?

    我无法解释以下代码 double d 100 double const d1 30 double const p d Line 1 double const p1 d1 Line 2 在上面的代码中 Line 1没问题 但是Line 2产生
  • JPA 单表层次结构中的 PostgreSQL 标识

    在具有单个表继承层次结构的 Hibernate JPA 环境中使用 PostgreSQL 时 我看到了奇怪的行为 首先是我的环境 PostgreSQL 8 3 春季2 5 6SEC01 Hibernate entitymanager 3 4
  • 具有 json 模式的 Kafka jdbc 接收器连接器无法正常工作

    使用最新的 kafka 和 confluence jdbc 接收器连接器 发送一条非常简单的 Json 消息 schema type struct fields type int optional false field id type s
  • 每 1 分钟定期调用一次 AWS Lambda

    我如何定期调用 AWS Lambda 特别是每 1 分钟一次 当前功能允许 Lambdas 设置为5分钟触发 https stackoverflow com a 27382253 358013 但我正在寻找更短的时间间隔 我想过永远运行 L
  • phpass 返回不同的结果

    我只是将我的项目从本地主机放到我的主机上 并使用相同的 phpass 函数 我收到不同的结果 并且返回的字符串的长度也不同 顺便说一句 一切都在本地主机上运行 所以在线时相同的函数返回 false 我想知道可能是什么问题 结果如下 Inpu
  • 如何在 Javascript/Angular JS 中进行舍入——但删除无关紧要的数字

    我的 Javascript 控制器中有以下语句 scope myList 0 1 0 5 0 6666666 我的 AngularJS 模板包含以下行 div i div 这会产生以下 HTML 输出 div 0 div div 1 div
  • JavaFX 一次运行大量倒计时器?

    所以我可以看到几种不同的方法来完成我需要的事情 并且我已经做了很多谷歌 堆栈溢出搜索 但找不到我真正想要的东西 我需要运行多个 倒计时器 我需要在不同时间同时运行大约 6 个 可能最多 10 个 倒计时器 我的主程序上有一个选项卡窗格 我在