【问题标题】:refresh label not working correctly javafx刷新标签无法正常工作 javafx
【发布时间】:2016-09-15 09:43:27
【问题描述】:

我在刷新标签时遇到问题。 我有这样的功能:

    public void majMontantPaye(Double montantPaye) {
    System.out.println("montant paye : "+montantPaye);

    setMontantPaye(this.montantPaye+montantPaye);

    Platform.runLater(() -> labelMontantPaye.setText(String.format("%.2f", this.montantPaye)+Messages.getMessage("0052")));
}

我的函数由 API 调用。此 API 与允许插入硬币的机器通信。而且我的功能必须显示机器中的总和插入。

问题是,当我在机器中同时插入大量硬币时,我的功能是正确调用检测到的每个硬币,因此System.out.println("montant paye : "+montantPaye); 正确显示检测到的每个硬币,但标签“labelMontantPaye”是不刷新检测到的每一个硬币。总和刚刚结束。

我猜 UI 没有正确刷新,但我不知道如何正确刷新我的标签。

请帮忙,对错误深表歉意,我是法国人。

【问题讨论】:

  • 那个方法是怎么调用的?也许在应用程序线程上?此外,Messages.getMessage("0052") 是一个长期运行的操作吗?是否有同步的块/方法可以阻止此操作,直到在不同的线程上执行一些长时间运行的代码?
  • 我的函数在不同的线程中执行。我有一个if(Platform.isFxApplicationThread()) { MainApp.getInstance.mainControllerLgetListeAchatController.majMontantPaye(_resteDu); } else { Platform.runLater(() -> MainApp.getInstance.mainControllerLgetListeAchatController.majMontantPaye(_resteDu); }); }
  • runLateryou 将任务排入 FXApplicationThread。但是当你有很多“事件”时,你只会看到最后一个结果。 (也许是以前的一小段时间)。如果你真的想看到中间的结果,我现在不能给你一个解决方案,因为在 SwingUtilities 中没有 runAndWait
  • 所以实际上你在 JavaFX 应用程序线程上执行它。这就是您的评论所显示的内容。
  • 对于硬币检测,您运行一个无限线程?稍微描述一下逻辑以便我们提供帮助。我的意思是您通常如何使用线程。记住不要在 JavaFX 线程上运行任何 UI 东西。

标签: javafx


【解决方案1】:

你可以按照下面的逻辑:

如 cmets 中所述: 使用 Platform.runLater(...) 将任务排入JavaFXThread。但是当你有很多“事件”时,你只会看到最后一个结果。 (也许是以前的一小段时间)。

?使用BlockingQueue 来存储每个插入的硬币。使用下面的方法(也可以查看教程中的可用方法,这里我使用 put 如果最多硬币会阻塞当前线程被插入到队列中,如果您不希望将最大值设置为 500.000):

public void insertCoin(//maybe the kind of coin){
      //add the coin into the BlockingQueue
      blockingQueue.put(//coin);
}

使用正在运行无限循环的Thread。线程正在唤醒 每次插入新硬币并且完成后,该线程 等待JavaFXThread 刷新标签文本:

new Thread(() -> {

        //Run an infinity Thread
        while (true) {

            // Blocks until the queue has really any coins inserted
            blockingQueue.get();

            // Synchronize with javaFX thread
            CountDownLatch latch = new CountDownLatch(1);
            Platform.runLater(() -> {
                label.setText(....);
                latch.countDown();
            });

            // Block the Current Thread until the text is refreshed from
            // JavaFX Thread
            latch.await();

        }
}).start();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多