动画内部platform.runlater导致无响应的用户界面

时间:2017-12-08 11:34:35

标签: animation javafx

我在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将设置模型,然后通知视图,该视图将执行以下操作。

  1. 在视图中设置值
  2. 添加听众
  3. 触发动画
  4. 在TextFields中设置Formatters
  5. 我面临的问题是用户界面会在几个小时后停止响应。

    我觉得动画是一项长期运行的任务,它在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中运行。(我认为)

0 个答案:

没有答案