2016-02-12 3 views
1

, пожалуйста, помогите мне, ребята .. мой наблюдаемый список был успешно обновлен на фоне темы. , но мое обновление графического интерфейса неточно.JavaFX pie Charts ObservableList (обновление графического интерфейса графического интерфейса неточно при передаче по потоку)

addPiechart1 в HBOX addPieChart2 в HBOX

observablelist1 = getobservablelist от piechart1

observablelist2 = getobservablelist от piechart2

проход observablelist1 в теме проход observablelist2 в теме экс

на процесс я звоню

animatePie (наблюдаемый список1, значение1);

aimatePie (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

Не уверен, что я понимаю ваш псевдокод, но это выглядит, как вы обновление круговой диаграммы (через свой список данных) из фонового потока. Вы не можете этого сделать: вы должны обернуть вызовы 'observableData.get (i) .setPieValue (...)' в 'Platform.runLater (...)'. –

+0

Спасибо за ответ. да, у тебя есть идеи. Я изменил данные наблюдаемого списка в фоновом потоке. данные наблюдаемого списка успешно изменились, но piechart в моем графическом интерфейсе иногда не обнаруживает, что мой наблюдаемый список был обновлен фоновым потоком. вот почему мой пирог содержит несколько кусочков. наблюдаемые данные были обновлены –

+0

, когда я добавляю Platform.runlater в качестве оболочки. обновления GUI после завершения потока. Я надеюсь, что что-то обновлялось сразу после изменения данных наблюдаемого списка в фоновом потоке. :(plss help me. –

ответ

0

Вы не можете обновить пользовательский интерфейс на фоне потока, так что вы должны обернуть вызовы, которые изменяют интерфейс с Platform.runLater(...):

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

У меня ошибка. «Локальная переменная, зависящая от выражения лямбды, должна быть окончательной или эффектно окончательной». доступ к наблюдаемым данным невозможен –

+0

См. обновление. (Извините: я редко использую индексированные для таких циклов ...) –

+0

Работает как шарм !!!! :) Это экономит время. Спасибо :) –

Смежные вопросы