我正在为学校完成最后的编程任务,并希望在JavaFx中以动态饼图的形式为我的java应用程序添加一些小功能眼睛糖果。
使用Netbeans 7.2 rc2,我从模板中创建了swing / javafx混合应用程序。我扩展了JPanelClass以创建一个shell,我的主应用程序可以使用它来访问FX功能。然而,我面临的问题是,当图表的初始化顺利进行时,当我尝试更新爆破的东西时,它会生成一个空指针异常。 我相信这是相关的代码:
实例化:
public class PieChartJFxPanel extends JApplet {
private static final int JFXPANEL_WIDTH_INT = 500;
private static final int JFXPANEL_HEIGHT_INT = 500;
StackPane root = new StackPane();
PieChart athleteChart;
ObservableList<PieChart.Data> pieChartData =FXCollections.observableArrayList();
private static JFXPanel fxContainer;
private int fAthletes=0;
private int rAthletes=0;
public PieChartJFxPanel(int totalAthletes,int finishedAthletes){
super();
fAthletes=finishedAthletes;
rAthletes=totalAthletes-fAthletes;
}
@Override
public void init() {
fxContainer = new JFXPanel();
fxContainer.setPreferredSize(new Dimension(JFXPANEL_WIDTH_INT, JFXPANEL_HEIGHT_INT));
add(fxContainer, BorderLayout.CENTER);
// create JavaFX scene
Platform.runLater(new Runnable() {
@Override
public void run() {
createScene();
}
});
}
场景构造函数:
private void createScene() {
pieChartData.add(new PieChart.Data("Finished",fAthletes));
pieChartData.add(new PieChart.Data("Outstanding",rAthletes));
athleteChart=new PieChart();
athleteChart.setLegendVisible(false);
athleteChart.setTitle("Race Status");
//athleteChart.setAnimated(true);
athleteChart.setData(pieChartData);
root.getChildren().add(athleteChart);
fxContainer.setScene(new Scene(root));
//
}
产生异常的方法:
public void setData(int total, int in){
final ObservableList<PieChart.Data> pieChartDat=FXCollections.observableArrayList();
pieChartDat.add(new PieChart.Data("Finished",fAthletes));
pieChartDat.add(new PieChart.Data("Outstanding",rAthletes));
athleteChart.setData(pieChartDat);
}
例外:
Exception in thread "main" java.lang.NullPointerException
at piechartjpanel.PieChartJFxPanel.setData(PieChartJFxPanel.java:95)
at piechartjpanel.AthleteIOChart.setAthletes(AthleteIOChart.java:62)
at piechartjpanel.Test.setter(Test.java:34)
at piechartjpanel.Test.main(Test.java:48)
任何帮助表示赞赏:) 提前致谢
答案 0 :(得分:1)
您永远不会初始化atheleteChart
athleteChart.setData(pieChartDat);
athleteChart
为null
,并且始终为。{/ p>
在构造函数中初始化它或只是将其更改为PieChart atheleteChart = new PieChart();
答案 1 :(得分:0)
我发现因为JavaFX使用对象作为数据模型,每当对象的参数发生变化时,图表会自动升级,因此在我上面发布的示例中更改了pieChart的值,我所需要的只是类似于以下内容:
pieChartData.get(index).setValues(blah,blah);
我发现Swing组件也习惯这样做,使用对象作为动态数据类型,自动更改以反映外观以反映更改的值。我很惊讶没有人发现这一点,也许我严厉地说了我的问题。 谢谢大家。