ComboBox中的NPE是selectedItem监听器吗?

时间:2014-03-18 06:49:35

标签: javafx javafx-2

我使用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)
    [...]

请告诉我我的代码有什么问题。

由于

1 个答案:

答案 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);
            }
        }
    });
相关问题