JavaFxアプリケーションでは、計算ボタンをクリックするたびにBarChartを更新したいと考えています。問題は、私は取得していますということです。異なるコントローラからBarChartを設定しようとすると、javaFX nullpointer例外が発生する
application.StatController.setActivityData(StatController.java:47)でjava.lang.NullPointerExceptionが
それは常にを指している: `xAxis.setCategories( optionsNames); しかし、それは、リストの要素を持っている(PrintScreenを参照してください:私はFormControllerクラスから呼び出されたsetActivityDataを持っている私のStatControllerクラスでhttps://image.ibb.co/b9YO8Q/Capture.png
を
StatControllerクラス:
public class StatController {
@FXML
private BarChart<String, Double> barChart;
@FXML
private CategoryAxis xAxis;
Activities activities = new Activities();
private Map<String, List<Double>> uniqueActivityOptions = new HashMap<>();
private ObservableList<String> optionsNames = FXCollections.observableArrayList();
public StatController(){}
@FXML
private void initialize() {
}
public void setActivityData(Activities activitiesList) {
for(Activity activity : activities.getActivityList()) {
String optionName = activity.getOption();
if(uniqueActivityOptions.containsKey(optionName)) {
uniqueActivityOptions.get(optionName).add((double) activity.getNumber());
} else {
List<Double> activityOptionList = new ArrayList<>();
activityOptionList.add((double) activity.getNumber());
uniqueActivityOptions.put(optionName, activityOptionList);
}
}
for (Map.Entry<String, List<Double>> entry : uniqueActivityOptions.entrySet()) {
optionsNames.add(entry.getKey());
}
xAxis.setCategories(optionsNames);
XYChart.Series<String, Double> series = new XYChart.Series<>();
for (Map.Entry<String, List<Double>> entry : uniqueActivityOptions.entrySet()) {
Double average = calculateAverage(entry.getValue());
series.getData().add(new XYChart.Data<>(entry.getKey().toString(), average));
}
barChart.getData().add(series);
}
private double calculateAverage(List<Double> values) {
double result = 0;
for (Double value : values) {
result += value;
}
return result/values.size();
}
}
FormControllerクラス:
public class FormController {
Activities act = new Activities();
List<Activity> activities = act.getActivityList();
private ObservableList<String> opt = FXCollections.observableArrayList(
"Option 1",
"Option 2",
"Option 3"
);
@FXML
private Button calculateButton;
@FXML
private TextField numberField;
@FXML
private ComboBox<String> options;
private String selectedOption;
@FXML
private void initialize() {
options.getItems().addAll(opt);
options.getSelectionModel().selectedItemProperty()
.addListener(new ChangeListener<String>() {
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
selectedOption = newValue;
}
});
}
@FXML
public void calculateButtonClicked(){
activities.add(new Activity(selectedOption, Integer.parseInt(numberField.getText())));
StatController sc = new StatController();
sc.setActivityData(act);
}
}
私はStatsControllerでsetActivityDataメソッドをテストしましたが、私はアクティビティを渡しています。
BarChartを渡して更新するコードを変更することをお勧めします。 これは些細なことだとわかっていますが、どうやってそれを行うのか本当に分かりません。
「 ありがとうございました!
他のNPEの質問と全く同じです。 NPEをスローするコードでxAxis変数をどこで初期化しますか?実行可能な参照はどこに割り当てられますか? –
nullpointerexceptionは何ですか、ObservableListの文字列はxAxis.setCategories(optionsNames)に渡されます。 xAxisは、JavaFXで使用される@FXMLによって初期化されます。 observableのリストがObservableListからxAxisに渡されることがわかります。 – erni