2012-05-21 133 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); 
    } 
});