JavaFx 根据 Java 线程的通知更新 UI

标签 java javafx-2

我是多线程、Java 和 JavaFx 的新手。我正在使用 JavaFX UI 构建一个应用程序,它根据实时数据不断更新图表。这是当前的设计,

<强>1。当按下 JavaFx 按钮时,我会调用一个线程,该线程设置框架来发送请求并获取响应

    startButton.setOnAction(new EventHandler<ActionEvent>() {
        @Override 
        public void handle(ActionEvent e) {             
            stopButton.setDisable(false);               

            if(!startButton.isDisable()){
                runSequence = new Thread(new Runnable(){

                    @Override
                 public void run() {
                    SynchThreads sharedObject = new SynchThreads();             
                    new Bridge(sharedObject);
                    startSequence = new Sequence(sharedObject);             
                    startSequence.performCalls();  

                    }                   
                });

                runSequence.start();

            }               
            startButton.setDisable(true);
        }
    });

<强>2。如上所述调用的runSequence线程会调用另一个不断接收数据的线程“callbackThread”。接收到的数据将传递给 runSequence 线程以进行进一步处理

    BusinessLogic businessLogic = new BusinessLogic();

    executor.submit(pduApiDllCallBackThread);//This collects the data in background

//Here we are back on runSequence thread that works on the collected data.  
         while(true){
        response = sharedObject.take();                 
        businessLogic.primeData(response);
    }

<强>3。 BusinessLogic 类处理此数据后,会向用户界面通知事件 ID 和应在图表上显示的数据。

  UI.notifyListeners(0, graphCoords);//here event ID is 0 and graphCoords is a HashMap

<强>4。在用户界面中,每次收到通知时,我都会使用 Platform.runLater 更新 LineChart。此通知每 4 毫秒发生一次。因此,我最终进行了大量 Platform.runLater 调用

public void notifyListeners(int eventType, Map<Integer, Float> graphCoords) {
    Platform.runLater(new Runnable(){

        @Override
        public void run() {
    //Old series is cleared. Showing dummy data being updated
                    series.getData().clear();
        series.getData().add(new XYChart.Data("1", Math.random()+1));
            series.getData().add(new XYChart.Data("3", Math.random()+5));
            series.getData().add(new XYChart.Data("4", Math.random()-25));
            series.getData().add(new XYChart.Data("2", Math.random()-10));
            series.getData().add(new XYChart.Data("-1", xxx));


        }

    });

}

如果可以这样做,或者是否有更好的方法在 UI 中处理此问题,请提供您的专家提示。我对 UI 下面通知 UI 的层没有更多控制权。由于通知每 4 毫秒发生一次,我想知道是否有更好的方法

感谢任何帮助。请帮忙。谢谢!

最佳答案

您可能会因频繁执行 Platform.runLater 而淹没 JavaFX 事件队列,因此您可能希望对响应进行批处理(例如以 10 为一组),然后为每个批处理进行一次 runlater 调用。

有一个特定的codereview stackoverflow 上的网站。

确保图表上的动画已关闭,这样它就不会在每次更新时尝试做太多事情。

您的解决方案确实看起来有点复杂,但也许它适合您的情况,我不知道。

我不知道你是如何处理并发的,但是看看java.util.concurrentconcurrency tutorial如果你还没有。还结账Concurrency in JavaFX如果你还没有。有时,较高级别的 java.util.concurrent 框架比较低级别的对象监视器等待/通知方法更具表现力、更不易出错、更易于使用且更易于推理。

您可能想要将您正在使用的一些线程标记为 daemon threads 。您可能还想添加一些逻辑来处理线程中断或进程取消,类似于 JavaFX Task 中的示例。文档。

如果您对 Java、多线程和 JavaFX 不熟悉,那么从多线程、联网 JavaFX 应用程序开始就已经很困难了。

通常,并发工作会使用 Task/Service framework 从 JavaFX 应用程序线程卸载到工作线程。 .

关于JavaFx 根据 Java 线程的通知更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13985059/

相关文章:

java - 如何让 JavaFX 2.0 ChoiceBox 选择它的第一个元素

css - javafx-2,通过 CSS 删除焦点突出显示

java - SessionFactory getCurrencSesion 不适用于 Autowiring

java - 如何在 Mac OS X 10.9 上加速 IntelliJ

java - 继承实体的最佳存储库/DAO

Java2D 与 Javafx Canvas 性能对比

java - 按多个属性对对象排序

java - 为什么在Java中在synchronized之前使用void关键字会抛出错误,但反过来却可以正常工作?

javafx-2 - JavaFX TableView : Cannot Override '-fx-text-fill' !

JavaFX 2.0 如何获得我的 GUI 生成器?哪个在旧的 JavaFX 中可用?