JavaFX: как заполнить ComboBox меняющимися значениями и обновить его

Я работаю над проектом для моего образования, который управляет начальной школой. я пытаюсь установить пользовательский интерфейс с javaFX, и я также использую базу данных SQLite.

Проблема заключается в том, что когда я устанавливаю два поля со списком, одно для уровня cb_nv, а другое cb_nb для номера класса на выбранном уровне. 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 на "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, чтобы показать только правильный выбор..


ИЗМЕНИТЬ:

Первая проблема решена, теперь показывает правильный вариант, но Exception появляется каждый раз при переходе с уровня с классами на другой пустой.. и if() переходит в финальный else{} до упора!

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

Любое предложение поможет. Должен ли я подумать об изменении всего подхода, потому что он слишком неправильный. Спасибо.


person Malek Boubakri    schedule 16.10.2015    source источник
comment
Никогда не сравнивайте строки, используя ==. Используйте метод equals.   -  person VGR    schedule 16.10.2015
comment
Ok! моя вина.. сейчас поменяю..   -  person Malek Boubakri    schedule 16.10.2015


Ответы (1)


Правило № 1. Модель выбора ComBox отличается от всех доступных моделей выбора, поэтому, если вы используете ComBox и у вас есть около 10 элементов, и вы выбираете 4-й элемент с индексом 3, а затем очищаете свои элементы и добавляете 11 элементов, ваш выбор является 4-й элемент в индексе 3. ваше значение для ComBox никогда не сбрасывается, если вы явно не сделаете это.

Поскольку у вас есть ArrayOutOfBoundsException, индекс не существует (надеюсь, вы заметили проблему)

person Elltz    schedule 17.10.2015
comment
Хм, да, ты прав. Это проблема, вы предлагаете какую-либо другую идею сделать это. - person Malek Boubakri; 17.10.2015
comment
Спасибо, я помечаю ваш ответ как принятый, потому что это помогает мне избежать заблуждения ... но у меня нет другой идеи. Вы предлагаете какой-либо подход? - person Malek Boubakri; 18.10.2015
comment
о, извини, я скоро вернусь с тобой, хорошо, пожалуйста@MalekBoubakri - person Elltz; 18.10.2015
comment
я взял слишком много свободного времени хм. @MalekBoubakri - person Elltz; 21.10.2015
comment
пожалуйста, вкратце, что вы хотите, например, вы сказали, что у вас есть список {1,2,3}, и когда вы выбираете 1, вы хотите получить список, подобный {11,111,111}, а также, если вы выбираете 2, то {222,22,222}. это твоя проблема да? а так не работает? я хочу создать демо, поэтому я прошу @MalekBoubakri извинить за эту длинную историю, и, пожалуйста, пока не принимайте ее. - person Elltz; 21.10.2015
comment
Спасибо @Elltz, но я думаю, что вчера я решил эту проблему с другим подходом, основанным на вашем ответе, если вы действительно хотите мне помочь, вы можете проверить эти проблемы, и я был бы признателен --› ссылка . Как видите, у меня нет знаний или навыков в javaFX... но я стараюсь изо всех сил - person Malek Boubakri; 21.10.2015
comment
хорошо, сэр, я помогу вам, не волнуйтесь, мы все начинаем с нуля. хотя я не очень эксперт (шучу), такие люди, как я, помогают стабилизировать мир :) @MalekBoubakri - person Elltz; 22.10.2015