2016-02-12 17 views
1

請幫助我的傢伙.. 我的observablelist已成功更新後臺線程。 但我的GUI更新不準確。JavaFX餅圖ObservableList(圖表GUI更新不準確,當傳遞線程)

addPiechart1到HBOX addPieChart2從piechart1

observablelist2 = getobservablelist HBOX

observablelist1 = getobservablelist從piechart2

通observablelist1主題 通observablelist2主題 前

我致電

animatePie(observablelist1,value1);

animatePie(observablelist2,value2);

public void animatePie(ObservableList<PieChart.Data> obs,int[] value){ 
      ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactory() { 
      @Override public Thread newThread(Runnable r) { 
       Thread thread = new Thread(r); 
       thread.setDaemon(true); 
       return thread; 
      } 
      }); 
       pieAddToQueue add = new pieAddToQueue(obs,value); 
       //add.run(); 
       executor.execute(add); 
    } 


private class pieAddToQueue implements Runnable { 
     ObservableList<PieChart.Data> observableData; 
     int[] value; 
     int loop; 
     public pieAddToQueue(ObservableList<PieChart.Data> obs,int[] value){ 
      observableData=obs; 
      this.value=value; 
      loop=0; 
     } 
     @Override 
     public void run() { 

       for(int i=0;i<value.length;i++){ 
        observableData.get(i).setPieValue(value[i]); 
        try { 
         Thread.sleep(200); 
        } catch (InterruptedException ex) { 
         Logger.getLogger(MISInfoBoardBottom.class.getName()).log(Level.SEVERE, null, ex); 
        } 
       } 

     } 
    } 
+0

不知道我理解你的僞代碼,但它看起來像你從後臺線程更新餅圖(通過其數據列表)。你不能這麼做:你必須在'Platform.runLater(...)'中將調用包裝爲'observableData.get(i).setPieValue(...)'。 –

+0

感謝您的回覆。是的,你有想法。我在後臺線程中更改了observablelist數據。可觀察列表數據成功更改,但我的GUI中的餅圖有時不會檢測到我的可觀察列表已由後臺線程更新。這就是爲什麼我的餅圖粘貼幾片。當我將Platform.runlater作爲包裝添加時,可觀察數據已更新 –

+0

。線程完成後GUI將會更新。我希望在更改後臺線程中可觀察列表的數據後立即更新某些內容。 :(PLS幫助我 –

回答

0

無法更新在後臺線程的UI,所以你必須換行改變了Platform.runLater(...) UI中的呼叫:

private class pieAddToQueue implements Runnable { 
    ObservableList<PieChart.Data> observableData; 
    int[] value; 
    int loop; 
    public pieAddToQueue(ObservableList<PieChart.Data> obs,int[] value){ 
     observableData=obs; 
     this.value=value; 
     loop=0; 
    } 
    @Override 
    public void run() { 

      for(int i=0;i<value.length;i++){ 
       PieChart.Data pieChartData = observableData.get(i); 
       int v = value[i] ; 
       Platform.runLater(() -> 
        pieChartData.setPieValue(v)); 
       try { 
        Thread.sleep(200); 
       } catch (InterruptedException ex) { 
        Logger.getLogger(MISInfoBoardBottom.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 

    } 
} 
+0

我得到的錯誤說。「lambda expresion中的局部變量feferenced必須是final或effectivily final。」可觀察的數據無法訪問 –

+0

查看更新(對不起:我很少使用索引編制循環,例如...) –

+0

工程就像一個魅力!!!! :)這樣可以節省時間。謝謝 :) –