2012-05-21 73 views
0

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

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

      }}); 
    } 

什么是在Java中这样做的最简单的方法?

回答

2

通常情况下,GUI的所有更新都会批处理并在GUI线程中处理。我认为你的架构是你真正的问题。每10毫秒更换标签是不明智的。即使Java FX支持这一点,用户只会看到闪烁。因此,我建议您更新内部数据模型,并以特定时间速率对用户可见的数据模型更改。然后,您的数据模型独立于您的用户界面,后台线程可以每2秒向您的UI提交一次单一更新。

0

什么触发了变化?如果文本链接到某个对象的值you could use binding以在对象值发生更改时自动更新GUI。

或者,您可以尝试手动执行此操作。例如(这很简单 - 当您运行runnables时可能需要清除列表以避免运行两次 - 在这种情况下,您需要处理并发问题等):

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); 
    } 
});