JavaFX:服务和GUI

托本:

对于一个学校项目,我正在为PLC编写一些可视化程序。因此,我有一个包含所有信息的mySQL数据库。当前,当我单击一个按钮时,程序将连接到数据库并在ArrayList中获取它的信息。然后,它检查ArrayList中的信息,并将Data放入ListView中。

问题是,我想让程序在Service中执行该操作。正如我所说的,GUI取决于ArrayList。而且我无法更改服务中的GUI,因为这样会出现此异常

  Sep 02, 2016 9:19:02 PM javafx.concurrent.Service lambda$static$488
WARNING: Uncaught throwable in javafx concurrent thread pool
java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
    at javafx.scene.Parent$2.onProposedChange(Unknown Source)
    at com.sun.javafx.collections.VetoableListDecorator.setAll(Unknown Source)
    at com.sun.javafx.collections.VetoableListDecorator.setAll(Unknown Source)
    at com.sun.javafx.scene.control.skin.LabeledSkinBase.updateChildren(Unknown Source)
    at com.sun.javafx.scene.control.skin.LabeledSkinBase.handleControlPropertyChanged(Unknown Source)
    at com.sun.javafx.scene.control.skin.LabelSkin.handleControlPropertyChanged(Unknown Source)
    at com.sun.javafx.scene.control.skin.BehaviorSkinBase.lambda$registerChangeListener$61(Unknown Source)
    at com.sun.javafx.scene.control.MultiplePropertyChangeListenerHandler$1.changed(Unknown Source)
    at javafx.beans.value.WeakChangeListener.changed(Unknown Source)
    at com.sun.javafx.binding.ExpressionHelper$SingleChange.fireValueChangedEvent(Unknown Source)
    at com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(Unknown Source)
    at javafx.beans.property.StringPropertyBase.fireValueChangedEvent(Unknown Source)
    at javafx.beans.property.StringPropertyBase.markInvalid(Unknown Source)
    at javafx.beans.property.StringPropertyBase.set(Unknown Source)
    at javafx.beans.property.StringPropertyBase.set(Unknown Source)
    at javafx.beans.property.StringProperty.setValue(Unknown Source)
    at javafx.scene.control.Labeled.setText(Unknown Source)
    at application.Controller$1$1.call(Controller.java:290)
    at application.Controller$1$1.call(Controller.java:1)
    at javafx.concurrent.Task$TaskCallable.call(Unknown Source)
    at java.util.concurrent.FutureTask.run(Unknown Source)
    at javafx.concurrent.Service.lambda$null$493(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at javafx.concurrent.Service.lambda$executeTask$494(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

我的第一个想法是仅提取服务中的SQL内容,然后通过方法获取数据

service.getValue();

但是问题是我不知道服务何时完成获取数据,因为当前数据为空。

丹尼尔的母亲:

基本上,您想运行一些过程并返回一些值,当然要Service钉住它。这就是我处理案件的方法,并且效果很好。

Service process = new Service() {
    @Override
    protected Task createTask() {
        return new Task() {
            @Override
            protected ObjectX call() throws Exception {

                updateMessage("Some message that may change with execution");
                updateProgress( workDone, totalWork ); 
                return ObjectX;
            }
        };
    }
};

process.setOnSucceeded( e -> {

    ObjectX processValue = (ObjectX)process.getValue();

    // TODO, . . . 
    // You can modify any GUI element from here...
    // ...with the values you got from the service
});

process.start();

注意事项

  1. inner方法protected ObjectX call()可以返回任何类型的对象。只要确保它是一个对象而不是原始类型即可。您可以在此过程中尽可能填充一些GUI元素,然后将其作为对象返回。protected VBox call()return my_vbox;
  2. ObjectX processValue = (ObjectX)processList.getValue();=>您应该将从Service背面获得的值转换为要使用的对象。如果仅仅是Object,您可能不必这样做。但是我怀疑你是否不得不使用just Object
  3. 还看到processList.setOnFailed()processList.setOnRunning()processList.setOnCancelled()processList.setOnScheduled()
  4. 您还可以像这样将某些GUI元素绑定到某些Thread属性

    label.textProperty.bind( process.messageProperty ); // messageProperty is a StringProperty
    progressBar.progressProperty.bind( process.progressProperty )
    
  5. 确保在调用之前已创建并启动了所有进一步增强过程的方法process.start()在开始该过程之前,什么都不会发生。

我希望这有帮助

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

GUI的JavaFX应用程序无法在Linux中通过开放服务

节流JavaFX GUI更新

JavaFx-更新GUI

JavaFX 2:背景和Platform.runLater与任务/服务

依赖项注入仅适用于服务类型对象和单例吗?(而不是gui?)

ActionListener和dynamic(?)GUI

可以同时通过GUI和命令行控制的Javafx程序?

从服务线程更新JavaFX GUI

javafx中的控制台输出和GUI文本字段?

无需服务和GUI应用程序即可连续执行

JavaFX中的GUI设计中的回调

Notepad ++ GUI和主题

通过REST Web服务和Spring分离GUI和DAO

如何在Ubuntu 12.04服务器中卸载XFCE和其他GUI?

Apache TomEE-无法访问“ TomEE GUI”,“服务器状态”,“ Manager应用程序”和“ Host Manager”服务

JavaFX中具有输入和输出参数的并发后台任务或服务

关于图形问题和性能在带有GUI的ubuntu 14.04 LTS服务器中

JavaFX和GUI线程:从线程更改按钮文本

在JavafX服务中运行线程

从javafx菜单项执行操作,并将gui和操作保存在单独的文件中

我在显示我在Eclipse,IntelliJ和Netbeans上使用JavaFX在Gluon Scene Builder中创建的GUI时遇到显示问题

单独的JavaFX GUI和逻辑

从服务更改活动GUI

如何从JavaSwing GUI打开JavaFX GUI?

GUI工具箱和窗口管理器如何利用显示服务器?

如何在Ubuntu服务器上安装GUI和浏览器并从Windows 7连接它?

Windows 上的 JavaFX GUI 线程和锁定屏幕

不断更新 JavaFX GUI

为什么 UDP 服务器的 Javafx GUI 停止工作