我想在后台运行一个任务,更新视图中的中间结果。我试图实现MVC JavaFX应用程序。该任务在模型中定义。 我想发送到主要threath部分结果,以便在视图中显示它们。 我使用updateValue()来做到这一点。另外,我在控制器中定义了对象属性和监听器。并发任务更新复杂对象JavaFX - swingworker等效?
我的问题:方法从侦听器更改(),每次在任务中执行updateValue()时都不会被触发。为什么?我如何强迫它做到这一点?
我还没找到很多复杂的例子。
我到目前为止有:
Model.cpp
ComplexObject _complexO;
public Task<ComplexObject> getModelTask() {
return new Task<ComplexObject>() {
@Override
protected ComplexObject call() throws Exception {
int numberOfFiles = 0;
boolean filesToRead = true;
while (filesToRead){
// ....
_complexO = new ComplexObject();
try{
//..
if(f.exists()){
_complexO.initialize();
numberOfScans ++;
}
else{
_complexO.initializeToNull();
}
String stringNumber = Converter.toString(numberOfFiles);
updateMessage(stringNumber);
updateValue(_complexO);
} catch(Exception ex){
ex.printStackTrace();
_complexO = null;
return _complexO;
}
filesToRead = areThereFilesToRead();
}
return _complexO;
}
};
}
Controller.cpp这里
...
Task< ComplexObject> task = _model.getModelTask();
_AJavaFXTextField.textProperty().bind(task.messageProperty());
_AJavaFXTextField.textProperty().addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue observable, String oldValue, String newValue) {
System.out.println("Success with messageProperty!!" + newValue);
}
});
SimpleObjectProperty<ComplexObject> complexObjectProperty = new SimpleObjectProperty<>();
complexObjectProperty.bind(task.valueProperty());
complexObjectProperty.addListener(new ChangeListener<ComplexObject>(){
@Override
public void changed(ObservableValue<? extends ComplexObject> observable, ComplexObject oldValue, ComplexObject newValue) {
if(newValue.data == null) {
System.out.println("value is new!!! " + scansNumber);
}
else if(newValue.isValid()){
System.out.println("I want to plot newValue data here");
}
}
});
Thread th= new Thread(task);
System.out.println("call TASK");
th.start();
}
我的问题/结论:
如何强制我执行的所有时间任务updateValue()真正执行侦听器 - 因此在我想绘制数据的位置执行代码。
为什么它比messageProperty更多的时间触发messageProperty的绑定? - 它应该是相同的次数。
为什么我发现侦听器的代码在调试模式下比正常执行时更多次触发?
任何关于此主题(从复杂的角度来看)的良好来源的推荐将是很好的。
我正在从JavaFX中的东西来取代SwingWorker。
我真的whant在最后:从任务返回complexObjects的列表,理想updateValue()将发送对象的每一个(部分结果)
我跟随: https://docs.oracle.com/javase/8/javafx/api/javafx/concurrent/Task.html
非常感谢任何contribuction