JavaFX:如何使用更改的值填充ComboBox并重新整理它

时间:2015-10-16 19:08:07

标签: java combobox javafx-2 listener observablelist

我正在研究管理小学的教育项目。我正在尝试使用javaFX设置用户界面,我也使用SQLite DB。

当我设置两个comboBox 时,一个用于学生级别 cb_nv而另一个用于 cb_nb所选级别中的classe数字cb_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时到&#34; B&#34;我仍然得到了#34; A&#34; classe列表。 这是应该进行更改的代码部分:

    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值。但是用户不应该选择不存在 classe,因此接下来该程序将在BD中搜索。我需要修复cb_nb才能显示有效的选择..

修改

第一个问题已经解决,它现在显示了正确的选项,但是每次从带有类的lvl移动到另一个空的时候都会出现异常......并且if()转到最终else{}一路走来!

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

任何建议都会有所帮助..我是否应该考虑改变所有方法,因为它看错了...... 感谢

1 个答案:

答案 0 :(得分:1)

规则号1 ComBox的selectionModel与所有可用的选择模型不同,因此如果您使用ComBox并且您有10个项目,并选择第4项 - 索引3,那么您稍后清除您的项目并添加11项,您的选择是索引3中的第4项。除非您明确这样做,否则ComBox的值永远不会重置。

你有ArrayOutOfBoundsException索引不存在 - (希望你看到问题)