我正在为一个管理小学的教育项目工作。我试图用javaFX设置用户界面,我也使用SQLite DB。

问题是,当我设置两个comboBox时,一个用于学生级别cb_nv,另一个用于所选级别的班级编号cb_nbcb_nv已初始化并且运行良好,第二个ComboBox应该采用从lvl返回的值cb_nv,并且应仅显示BD中存在的类。
这是我的方法:

@FXML
ComboBox<String> cb_nb, cb_nv;
int lvl=1;
int nb=1;
ObservableList<String> optionslvl=FXCollections.observableArrayList("A","B","C","D");
ObservableList<String> optionsnb=bdClss.getNBListByLvl(lvl);

...

cb_nv.setItems(optionslvl);
cb_nv.setValue("A");
cb_nb.setItems(optionsnb);
cb_nb.setValue("1");


该列表是从BD成功获得的,并显示在cb_nb(lvl = 1)中,没有问题,但是当我将cb_nv更改为“ B”时,我仍然得到了“ A”类列表。
这是应该进行更改的部分代码:

    cb_nv.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
        @Override
          public void changed(ObservableValue<? extends Number> observableValue, Number number,  Number number2) {
            nb=1;
            cb_nb.setValue("1");
            if(cb_nv.getItems().get((Integer) number2)=="A"){
            lvl=0;
            cb_nb.getItems().clear();
                cb_nb.setItems(bdClss.getNBListByLvl(lvl));}
                else if(cb_nv.getItems().get((Integer) number2)=="B"){
            lvl=1;
            cb_nb.getItems().clear();
                cb_nb.setItems(bdClss.getNBListByLvl(lvl));}
                else if(cb_nv.getItems().get((Integer) number2)=="C"){
            lvl=2;
            cb_nb.getItems().clear();
                cb_nb.setItems(bdClss.getNBListByLvl(lvl));}
                else if(cb_nv.getItems().get((Integer) number2)=="D"){
            lvl=3;
            cb_nb.getItems().clear();
                cb_nb.setItems(bdClss.getNBListByLvl(lvl));}
                else{System.err.println("Erreur lors de changement de class..");}
          }
        });

    cb_nb.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
        @Override
          public void changed(ObservableValue<? extends Number> observableValue, Number number,  Number number2) {
            if(cb_nb.getItems().get((Integer) number2)=="1"){nb=1;}
            else if(cb_nb.getItems().get((Integer) number2)=="2"){nb=2;}
            else if(cb_nb.getItems().get((Integer) number2)=="3"){nb=3;}
            else if(cb_nb.getItems().get((Integer) number2)=="4"){nb=4;}
            else if(cb_nb.getItems().get((Integer) number2)=="5"){nb=5;}
            else if(cb_nb.getItems().get((Integer) number2)=="6"){nb=6;}
            else if(cb_nb.getItems().get((Integer) number2)=="7"){nb=7;}
            else if(cb_nb.getItems().get((Integer) number2)=="8"){nb=8;}
            else if(cb_nb.getItems().get((Integer) number2)=="9"){nb=9;}
            else{System.err.println("Erreur lors de changement de class..");}
          }
        });


我最终需要返回的nb值。但是用户不应选择一个不存在的类,因为接下来程序将在BD中对其进行搜索。我需要修复cb_nb以仅显示有效选择。



编辑:

第一个问题已解决,现在显示正确的选项,但是每次从具有类的lvl移到另一个空的lc时,都会出现一个异常,并且if()一直到最终的else{}

Erreur lors de changement de class..
Exception in thread "JavaFX Application Thread" java.lang.ArrayIndexOutOfBoundsException


任何建议都将帮助。
谢谢

最佳答案

规则1 ComBox的selectionModel与所有可用的selectionmodel不同,因此,如果使用ComBox并且有10个项目,则选择第4个项目(索引为3),然后清除项目并添加11项目,您的选择是索引3中的第4个项目。除非明确进行操作,否则ComBox的值永远不会重置。

就是说您拥有ArrayOutOfBoundsException索引不存在-(希望您已经看到了问题)

08-06 19:15