1

我正在尝试在 JavaFX 下创建一个自定义 Canvas 小部件,它从许多不相关的工作线程中收集信息。“更新”事件可能以各种速率出现,有时太快,有时根本没有,这意味着需要正确解决“更新太快”和“空闲时间”要求。更新次数太多,因此每次执行更新时发出Runnable并不是一个好的解决方案。

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

我的问题最接近的答案似乎是这篇带有 GUIUpdater 帮助器类的帖子,但 Canvas 似乎没有直接更新属性。我正在尝试找到一种方法来使用绑定参数“插入”所需的更新功能,但很幸运。我什至试图了解 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);
}
4

1 回答 1

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的原子引用替换。

于 2016-04-12T15:54:00.870 回答