JavaFX,更改饼图切片' name导致IllegalStateException

时间:2014-10-15 10:05:28

标签: java javafx

我现在正在使用一个JavaFX,现在我创建了PieChart 我在教程“http://docs.oracle.com/javafx/2/charts/pie-chart.htm#CIHFDADD”中看到了 饼图标签可能有用,因此我让它显示名称和数据值 就像这个

private String[] caption = {dataInp.getConstantValue(15, 8)+"\n"+(int)(percent[0]*100)+"%"
        , dataInp.getConstantValue(16, 8)+"\n"+(int)(percent[1]*100)+"%"
        , dataInp.getConstantValue(17, 8)+"\n"+(int)(percent[2]*100)+"%"
        , dataInp.getConstantValue(18, 8)+"\n"+(int)(percent[3]*100)+"%"};
pieChartData = FXCollections.observableArrayList(
            new PieChart.Data(caption[0], percent[0]),
            new PieChart.Data(caption[1], percent[1]),
            new PieChart.Data(caption[2], percent[2]),
            new PieChart.Data(caption[3], percent[3]));
chart = new PieChart(pieChartData);

结果完全没问题 下一步是在数据用户选择

后使其动态化
public void setSlice(double percent, int index){
        pieChartData.get(index).setPieValue(percent);
        pieChartData.get(index).setName(caption[index]+"\n"+(int)(percent*100)+"%");
    }

并且行pieChartData.get(index).setName(caption[index]+"\n"+(int)(percent*100)+"%");导致

  

线程“AWT-EventQueue-0”中的异常   java.lang.IllegalStateException:不在FX应用程序线程上;   currentThread = AWT-EventQueue-0

无论如何都要更改切片名称?或者使结果与我上面描述的相似?

1 个答案:

答案 0 :(得分:0)

Exception可以看出最可能的原因是方法setSlice()是从JavaFX Application Thread以外的线程调用的。

有很多方法可以解决此问题:

  1. 这是最简单的方法,请从JavaFX Application thread
  2. 调用该方法
  3. 您可以从应用程序线程调用该方法,或覆盖Platform.runLater()
  4. 中的方法体

    您可以执行以下操作:

    Platform.runLater(new Runnable(){
         setSlice(10, 3);
    });
    

    或,

    public void setSlice(double percent, int index){
       Platform.runLater(new Runnable(){
           pieChartData.get(index).setPieValue(percent);
           pieChartData.get(index).setName(caption[index]+"\n"+(int)(percent*100)+"%");
       });
    }
    
    1. 您还可以查看Concurrency in JavaFX,了解如何使用TaskService