我现在正在使用一个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
无论如何都要更改切片名称?或者使结果与我上面描述的相似?
答案 0 :(得分:0)
从Exception
可以看出最可能的原因是方法setSlice()
是从JavaFX Application Thread
以外的线程调用的。
有很多方法可以解决此问题:
JavaFX Application thread
您可以执行以下操作:
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)+"%");
});
}