2016-04-12 43 views
0

我正尝试在JavaFX下创建一个自定义Canvas小部件,该小部件从大量不相关的工作线程收集信息。 “更新”事件可能有不同的速率,有时太快,有时甚至没有,意味着需要适当解决“太快的更新”和“空闲时间”的要求。更新数量太高,因此每次执行更新时发出一个Runnable并不是一个好的解决方案。JavaFX和Canvas的快速更新

只是为了测试,我的蛮力方法是创建一个AnimationTimer来更新Canvas对象的视觉效果。这个解决方案工作正常,但是当然有时候Canvas不需要更新,从而使整个过程效率低下。

与我的问题最接近的答案似乎是this post与GUIUpdater助手类,但画布似乎没有直接更新属性。我试图找到一种方法来用绑定的参数“插入”所需的更新功能,但运气不错。我甚至尝试了解Canvas是否有“更新”事件,但我没有找到它。据我所知,我发现的所有其他答案都不符合要求。

在此先感谢

编辑

这里是我用来确保代码,只有当数据发生变化,那么画布将绘制:

new AnimationTimer() { 
    @Override 
    public void handle(long now) { 
     if (needsUpdate.getAndSet(false)) { 
      myCustomCanvasRepaint(); 
     } 
    } 
}.start(); 

这是触发类似的东西:

AtomicBoolean needsUpdate = new AtomicBoolean(true); 
... 
public void needsUpdate() { 
    needsUpdate.set(true); 
} 
+0

有关频繁更新的相关问题:http://stackoverflow.com/questions/23488280/throttling-javafx-gui-updates –

+0

这可能会解决“太频繁”但不是“闲置”的情况。我会更新我的问题,以显示我使用类似方法所做的工作。 – Panayotis

+0

我不确定我是否理解“空闲”情况下的含义 –

回答

0

这是真正的Throttling javafx gui updates重复,但你可以做

private final AtomicBoolean updated = new AtomicBoolean(); 

// ... 

Thread someBackgroundThread = new Thread(() -> { 
    while (true) { 
     waitArbitraryTimeForData() ; 
     if (updated.getAndSet(false)) { 
      updateCanvas(); 
     } 
    } 
}); 

private void updateCanvas() { 
    Platform.runLater(() -> { 
     updated.set(true); 
     // repaint canvas... 
    } 
} 

根据您的更新,依靠什么样的数据,你可能需要围绕Platform.runLater()的体数据的一些额外的锁定。或者(可能更好),用不可变类代表累积更新,并用对该类的原子引用代替AtomicBoolean