JavaFX:如何用变化的值填充组合框并刷新它
JavaFX: How to fill a ComboBox with changing values and refrech it
我正在从事一个管理小学的教育项目。我正在尝试使用 javaFX 设置用户界面,并且我还使用 SQLite 数据库。
当我设置两个组合框时出现的问题,一个是学生级别 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
任何建议都会有所帮助..我是否应该考虑改变所有的方法因为它看起来太错误了..
谢谢
规则 1 ComBox
的 selectionModel 不同于所有可用的 selectionmodel,因此如果您使用 ComBox
并且您有大约 10 个项目,并且您 select 第 4 项 - 索引为 3,您稍后清除您的项目并添加 11 项,您的 selection 是索引 3 中的第 4 项。您的 ComBox 值永远不会重置,除非您明确去做。
你有 ArrayOutOfBoundsException
索引不存在 -(希望你已经看到问题)
我正在从事一个管理小学的教育项目。我正在尝试使用 javaFX 设置用户界面,并且我还使用 SQLite 数据库。
当我设置两个组合框时出现的问题,一个是学生级别 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
任何建议都会有所帮助..我是否应该考虑改变所有的方法因为它看起来太错误了.. 谢谢
规则 1 ComBox
的 selectionModel 不同于所有可用的 selectionmodel,因此如果您使用 ComBox
并且您有大约 10 个项目,并且您 select 第 4 项 - 索引为 3,您稍后清除您的项目并添加 11 项,您的 selection 是索引 3 中的第 4 项。您的 ComBox 值永远不会重置,除非您明确去做。
你有 ArrayOutOfBoundsException
索引不存在 -(希望你已经看到问题)