2016-02-12 54 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

工程就像一个魅力!!!! :)这样可以节省时间。谢谢 :) –