0

我想批量处理一堆任务(更新到 GUI)并每秒运行一次。(我每秒有数百次更新,导致 Java FX 2 冻结)

    public void update(String price){
        Platform.runLater(new Runnable(){
            @Override
            public void run() {
                priceLabel.setText(price);

            }});
    }

在 Java 中执行此操作的最简单方法是什么?

4

2 回答 2

2

好吧,通常对 GUI 的所有更新都是批处理的,并在 GUI 线程中处理。我认为你的架构是你真正的问题。每 10 毫秒更改一次标签是不明智的。即使 Java FX 支持这一点,用户看到的唯一东西就是闪烁。所以我建议你更新你的内部数据模型,并让你的数据模型的变化以一定的时间速率对用户可见。然后,您的数据模型独立于您的 UI,并且后台线程可以每 2 秒左右向您的 UI提交一次更新。

于 2012-05-21T08:04:05.467 回答
0

是什么触发了变化?如果文本链接到某个对象的值,您可以使用绑定来在对象的值更改时自动更新 GUI。

或者,您可以尝试手动操作。例如,请参见下面的代码(这很简单 - 您可能需要在运行可运行对象时清除列表以避免运行它们两次 - 在这种情况下您需要处理并发问题等):

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
final List<Runnable> list = new CopyOnWriteArrayList<Runnable>(); //your updates
Runnable updateGui = new Runnable() {

    @Override
    public void run() {
        Platform.runLater(new Runnable() {

            @Override
            public void run() {
                for (Runnable r : list) {
                    r.run();
                }
            }
        });
    }
};

scheduler.scheduleAtFixedRate(updateGui, 0, 1, TimeUnit.SECONDS);

list.add(new Runnable() {

    @Override
    public void run() {
        priceLabel.setText(price);
    }
});
于 2012-05-21T14:17:01.487 回答