【发布时间】:2016-08-03 03:05:32
【问题描述】:
我正在尝试在 JavaFX 下创建一个自定义 Canvas 小部件,它从许多不相关的工作线程中收集信息。 “更新”事件可能以各种速率出现,有时太快,有时根本没有,这意味着需要正确解决“更新太快”和“空闲时间”要求。更新次数过多,因此每次执行更新时发出 Runnable 并不是一个好的解决方案。
只是为了测试,我的蛮力方法是创建一个 AnimationTimer 来更新 Canvas 对象的视觉效果。该解决方案运行良好,但当然有时 Canvas 不需要更新,导致整个过程效率低下。
与我的问题最接近的答案似乎是 this post 带有 GUIUpdater 帮助器类,但 Canvas 似乎没有直接的 update 属性。我正在尝试找到一种方法来使用绑定参数“插入”所需的更新功能,但很幸运。我什至试图了解 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);
}
【问题讨论】:
-
这可能会解决“过于频繁”但不能解决“空闲”的情况。我将更新我的问题以显示我使用类似方法所做的事情。
-
我不确定我理解你所说的“空闲”情况是什么意思
-
我的意思是,有时需要快速更新(超出 JavaFX 的处理能力),但有时根本不需要更新。没有持续的更新流;仅在需要时。这与示例中的情况不同。这里看起来更像是一个类似事件的模型?
-
我还是不明白。如果示例中的后台线程空闲,则不会安排任何
Platform.runLater(...)调用。
标签: java javafx javafx-2 javafx-8 java-canvas