【问题标题】:JavaFX: How to fill a ComboBox with changing values and refrech itJavaFX:如何用变化的值填充组合框并刷新它
【发布时间】:2015-10-16 19:08:07
【问题描述】:

我正在开展一个管理小学的教育项目。我正在尝试使用 javaFX 设置用户界面,并且我还使用 SQLite DB。

我设置两个comboBox时的问题,一个用于学生级别 cb_nv,另一个cb_nb用于班级编号 在所选级别。 cb_nv 已初始化且运行良好,第二个 ComboBox 应采用从 cb_nv 返回的值 lvl,并且应仅显示 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 移动到另一个空的 lvl 时都会出现异常......并且if() 一直到最终的else{}

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

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

【问题讨论】:

  • 永远不要使用==比较字符串。使用equals 方法。
  • 好的!我的错..我现在会改变它..

标签: java combobox javafx-2 listener observablelist


【解决方案1】:

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

如果你有 ArrayOutOfBoundsException 索引不存在 -(希望你已经看到了问题)

【讨论】:

  • 嗯,是的,你是对的。这就是问题所在,您是否建议任何其他想法来做到这一点..
  • 哦,对不起,我会马上回来陪你的-好的,请@MalekBoubakri
  • 我请假太多了,嗯。 @MalekBoubakri
  • 请简而言之,您想要什么,例如,您说您有列表 {1,2,3},当您选择 1 时,您想获得一些类似 {11,111,111} 的列表,如果您选择 2 然后 {222,22,222}。那是你的问题吗?但它不能这样工作?我想创建一个演示,这就是为什么我要问@MalekBoubakri 对这些长篇大论感到抱歉,请暂时不要接受。
  • 好的先生,我会帮助你的,别担心,我们都是从 0 开始的。虽然我不是专家(开玩笑)像我这样的人帮助稳定世界 :)@MalekBoubakri
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 2010-12-25
  • 1970-01-01
  • 2019-10-20
  • 2015-06-16
相关资源
最近更新 更多