Как сохранить ключ в ChoiceBox
уважаемые гуру!
В HTML есть прекрасный тег <select> где внутренний тег <option> принимает value который может действует как отдельный параметр. <option value="1">Шапокляк</option> В итоге я могу отобразить текст "Шапокляк", и указать в value ID=1 этой записи.
Так вот. Пишу на JavaFX приложение и задался следующим вопросом:
Из всех выпадающих списков, я нашел только ChoiceBox и ComboBox. Вся проблема в том, что они принимают только observableArrayList а это значит, что в любом случае я могу установить только значения, который попадают в список, и их индексы идут по очереди:
> ObservableList<String> langs = FXCollections.observableArrayList("Java", "Java", "JavaScript", "C#");
> ComboBox<String> langsComboBox = new ComboBox<String>(langs);
Но т.к. список может содержать много одинаковых значений, я не могу ориентироваться на поле "значения".
Мне нужен именно id этого значения.
Пока в голову приходит только нечто подобное:
Из выборки БД создать HashMap<K,<K,V>>, где начальный K - это номер по порядку.
Далее HashMap<K,<K,V>> преобразовывать в ArrayList (начальный K как index в ArrayList, V - устанавливать именно значением ChoiceBox).
Далее вешать слушатель langsComboBox.setOnAction, и по клику получать index этой записи.
Далее: пробегаться по HashMap<K,<K,V>> и по за index искать второй K, что и будет являться значением?
Но мне кажется данный вариант слишком уж преувеличенным.
Есть ли более простые методы как это сделать?
Или кто-нибудь, может быть, поделится собственными примерами реализации выпадающих списков? (достаточно просто примера)
Ответы (1 шт):
Сам спросил, сам отвечу)) Довольно-таки простой способ, кстати.
Сам класс Organization
public class Organization {
public int idOrganization;
public String nameOrganization;
public Organization() {
}
public Organization(int idOrganization, String nameOrganization) {
this.idOrganization = idOrganization;
this.nameOrganization = nameOrganization;
}
public int getIdOrganization() {
return idOrganization;
}
public String getNameOrganization() {
return nameOrganization;
}
@Override
public String toString() {
return getNameOrganization();
}
}
Далее исполнение уже где угодно:
public ChoiceBox<Organization> organization;//установка нашего списка в контроллере
List<Organization> list = new ArrayList<>(); //создаем пустой список
ObservableList<Organization> binOrganization = FXCollections.observableArrayList(list);
organization.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Organization>() {
@Override
public void changed(ObservableValue<? extends Organization> observable, Organization oldValue, Organization newValue) {
System.out.println(newValue.getIdOrganization());
System.out.println(newValue.getNameOrganization());
}
});
//присваиваем значения
binOrganization.add(new Organization(41, "Организация 1"));
binOrganization.add(new Organization(25, "Новая ООО"));
binOrganization.add(new Organization(8, "МУП Какой-то"));
//и устанавливаем в наш ChoineBox
organization.setItems(binOrganization);
В итоге, вместо System.out.println можно уже присвоить какую-то другую переменную, которая будет использоваться в следующей Scene.
Всем спасибо :)