Как отобразить и получить доступ к ComboBox, созданному в классе Java, в моем FXML? - PullRequest
1 голос
/ 19 апреля 2019

Я делаю приложение, используя только 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 для запроса о гражданстве?Я заметил, что у него было намного больше вариантов, чем у форм, когда он запрашивает национальность / страну, и он также был не полностью в алфавитном порядке.Спасибо всем заранее.

1 Ответ

0 голосов
/ 19 апреля 2019

Мне удалось выяснить это после просмотра некоторых других вопросов 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.

...