Как отобразить и получить доступ к ComboBox, созданному в классе Java, в моем FXML?

Я делаю приложение, используя только Java и FXML для школьного проекта. Мне не разрешено использовать конструктор сцен. В приложении пользователь вводит свою информацию в форму. Затем эта информация используется для создания экземпляра одного из трех возможных классов. Одним из полей формы является «Национальность», поэтому я хотел бы использовать раскрывающийся список, содержащий страны, из которых они могут выбирать. Я создал ComboBox в своем классе Main.java (изначально он был в моем контроллере) с помощью ответа MBec на этот вопрос: ссылка.

Мой вопрос: как мне получить доступ к ComboBox, который я сделал в Main.java, из моего файла FXML и отобразить его на моей существующей сцене? В настоящее время у меня есть заполнитель ComboBox, но он не заполнен.

Заполненный ComboBox из Main.java:

ObservableList<String> all_countries = Stream.of(Locale.getISOCountries())
                .map(locales -> new Locale("", locales))
                .map(Locale::getDisplayCountry)
                .collect(Collectors.toCollection(FXCollections::observableArrayList));

final ComboBox<String> country_list = new ComboBox<>(all_countries);  

Я попытался установить свойство onAction для пустого ComboBox, созданного в FXML, с помощью метода, который создавал, а затем возвращал заполненный ComboBox из Main.java, но, как и ожидалось, это не сработало.

Мне удалось убедиться, что ComboBox работает, установив его в качестве корня новой сцены. Это было просто для того, чтобы убедиться, что сам ComboBox не был причиной проблемы. Новая сцена, используемая для тестирования:

Я также попытался сделать ComboBox по-другому (см. ответ Кейури Бхандери здесь: ссылка), однако это тоже не сработало.

Код для моей существующей сцены:

Parent root = FXMLLoader.load(getClass().getResource("view/sample.fxml"));
primaryStage.setTitle("form");
primaryStage.setScene(new Scene(root, 600, 600));

Я ожидал, что смогу получить доступ к ComboBox 'country_list' из sample.fxml и отобразить его на моей существующей сцене, следовательно, это моя цель. Я новичок в Java и FXML, поэтому ответ может быть очевиден, но я застрял на этом на день или два. Приносим извинения за плохое форматирование; это мой первый раз, когда я использую SO. Если у кого-то есть свободное время, у меня также есть дополнительный вопрос. Является ли getISOCountries() лучшим методом Locale для использования при запросе национальности? Я заметил, что у него было гораздо больше вариантов, чем в формах, когда запрашивается национальность / страна, и это также не было полностью в алфавитном порядке. Спасибо всем заранее.


person ed_3stacks    schedule 18.04.2019    source источник
comment
возможно, вы могли бы схитрить и посмотреть, как это делает SceneBuilder. Я перешел на OpenJDK12, поэтому запустить и запустить JavaFX довольно сложно, но я считаю, что вам нужны аннотации @FXML в полях управления, а имя поля должно соответствовать тегу в FXML.   -  person    schedule 19.04.2019
comment
@Benson99 Benson99 Это мой текущий план действий, если ничего не поможет. Я несколько раз использовал аннотации @FXML в своем классе Controller, но только для ссылки на fx:ID в файле fxml. Не уверен, как использовать его по-другому, но я посмотрю на это, спасибо за предложение.   -  person ed_3stacks    schedule 19.04.2019


Ответы (1)


Мне удалось понять это после просмотра некоторых других вопросов SO, касающихся подобных проблем. Я сделал HBox внутри своего FXML так:

<HBox
    id="country_container"
    fx:id="country_container"
    GridPane.columnIndex="1"
    GridPane.rowIndex="12"
    />

Он просто действует как контейнер для ComboBox. Затем я сделал следующее в методе Initialize моего контроллера:

countries_combo();
combo_box.getChildren().add(country_list);

Первая строка вызывает метод, который создает и возвращает ComboBox, а вторая добавляет его как дочерний элемент в HBox, созданный вручную.

person ed_3stacks    schedule 19.04.2019