我正尝试在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);
}
有关频繁更新的相关问题:http://stackoverflow.com/questions/23488280/throttling-javafx-gui-updates –
这可能会解决“太频繁”但不是“闲置”的情况。我会更新我的问题,以显示我使用类似方法所做的工作。 – Panayotis
我不确定我是否理解“空闲”情况下的含义 –