我在MVC架构客户端工作。在这里,我有一段代码,用于设置模型内的值。在应用程序中,我有一个数据绑定框架,它通知所有视图成员,需要在模型值更新时得到通知。应用程序的整体视图由部分Swing和部分JavaFX构成。此上下文中的视图来自JavaFx。一旦根据更改的模型更新视图,视图还将触发某些javafx.animation(在不同组件中为300-700ms)。
由于主视图是由swing构成的,组件是由JavaFX构成的,因此我需要调用Platform.runlater来更新FX组件(原因是必须使用FX-Application线程访问FX组件)。
代码看起来像这样
public void setSpotNearRate(final Map<RateField.RateFieldsEnum, String> nearSpotRate) {
if(!Platform.isFxApplicationThread()) {
Platform.runLater(new Runnable() {
@Override
public void run() {
setModelValue(nearSpotRate);
}
});
} else {
setModelValue(nearSpotRate);
}
}
setModelValue将设置模型,然后通知视图,该视图将执行以下操作。
。 我面临的问题是用户界面会在几个小时后停止响应。
我觉得动画是一项长期运行的任务,它在Platform.runlater中运行,使得UI无法响应。 如何在不使视图无响应的情况下更新视图?如果我删除platform.runlater,将会出现NullPointer / NotFXApplicationThread / UI闪烁问题,因为它将在swing线程内运行。如果我有platform.runlater,则UI变得无法响应。
我尝试在java.concurrency.Task线程中添加动画部分,但动画会在一段时间内发生,然后就会停止。
public void reInitMin() {
update all wiew components
add listeners
if (!isEditable) {
justPressed = false;
Task task = new Task<Void>(){
@Override
public void call() {
animateField();
return null;
}
});
Thread thread = new Thread(task);
thread.start();
}
add formatters
}
注意:
这里reInitMin()是视图部分的一个函数,它将由数据视图绑定框架调用。当我在Platform.runlater中调用框架时,这个函数也将在platform.runlater中运行。(我认为)