我使用getSelectionModel().selectedItemProperty().addListener
编写了一个带有三个组合框绑定的示例代码。
我的代码仅在第一选择条件下正常工作,在更改combox1
后出现第二个错误。
public class ThreeComboBox extends Application {
@Override
public void start(Stage primaryStage) {
List combox1List = new ArrayList();
for (int i = 1; i < 10; i++) {
combox1List.add(i);
}
final Map combox2Map = new HashMap();
for (int i = 0; i < combox1List.size(); i++) {
List l = new ArrayList();
for (int j = 1; j < 10; j++) {
int k = (int) combox1List.get(i) * 10 + j;
l.add(k);
}
combox2Map.put(combox1List.get(i), l);
}
final Map combox3Map = new HashMap();
for (Object o : combox1List) {
for (Object o1 : (List) combox2Map.get(o)) {
List l = new ArrayList();
for (int i = 1; i < 10; i++) {
int value = (int) o1 * 10 + i;
l.add(value);
}
combox3Map.put(o1, l);
}
}
ObservableList combox1 = FXCollections.observableList(combox1List);
HBox box = new HBox(20);
box.setPadding(new Insets(20, 20, 20, 20));
ComboBox cb1 = new ComboBox();
final ComboBox cb2 = new ComboBox();
final ComboBox cb3 = new ComboBox();
cb1.setItems(combox1);
cb1.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue ov, Object t, Object t1) {
ObservableList combox2 = FXCollections.observableArrayList((List) combox2Map.get(t1));
cb2.setItems(combox2);
}
});
cb2.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue ov, Object t, Object t1) {
ObservableList combox3 = FXCollections.observableArrayList((List) combox3Map.get(t1));
cb3.setItems(combox3);
}
});
box.getChildren().addAll(cb1, cb2, cb3);
Scene scene = new Scene(box, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
错误:
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
at java.util.ArrayList.addAll(ArrayList.java:556)
at com.sun.javafx.collections.ObservableListWrapper.addAll(ObservableListWrapper.java:165)
at com.sun.javafx.collections.ObservableListWrapper.addAll(ObservableListWrapper.java:160)
at javafx.collections.FXCollections.observableArrayList(FXCollections.java:218)
at threecombobox.ThreeComboBox$2.changed(ThreeComboBox.java:79)
[...]
请告诉我我的代码有什么问题。
由于
答案 0 :(得分:1)
您在组合框的第二次更新期间获得此NPE,因为为combobox2(cb2.setItems(combox2);
)设置新值会重置selectedItem,因此t1
(新值)变为null
。
请尝试使用下一代码:
cb2.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue ov, Object t, Object t1) {
if (t1 != null) {
ObservableList combox3 = FXCollections.observableArrayList((List) combox3Map.get(t1));
cb3.setItems(combox3);
}
}
});