Как сохранить ключ в 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 шт):

Автор решения: Jekson353

Сам спросил, сам отвечу)) Довольно-таки простой способ, кстати.

Сам класс 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.
Всем спасибо :)

→ Ссылка