如何在我的 FXML 中显示和访问在 Java class 中创建的 ComboBox?
How do I display and access a ComboBox made in a Java class in my FXML?
我正在为一个学校项目制作一个仅使用 Java 和 FXML 的应用程序。我不允许使用场景生成器。在应用程序中,用户将他们的信息输入到表单中。然后使用此信息创建三个可能 classes 之一的实例。表单的字段之一是 'Nationality',因此我想使用包含国家/地区的下拉列表供他们选择。在 MBec 对这个问题的回答的帮助下,我在我的 Main.java class(它最初在我的控制器中)中创建了一个 ComboBox:。
我的问题是:如何从我的 FXML 文件中访问我在 Main.java 中制作的 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);
我尝试在 FXML 中创建的空 ComboBox 上设置 onAction 属性,方法是创建然后从 Main.java 返回填充的 ComboBox,但正如预期的那样,这不起作用。
我确实通过将 ComboBox 设置为新场景的根来验证其是否正常工作。这只是为了确保 ComboBox 本身不是问题的原因。用于测试的新场景:
我也尝试过以不同的方式制作 ComboBox(请在此处查看 Keyuri Bhanderi 的回答:),但这也没有用。
我现有场景的代码:
Parent root = FXMLLoader.load(getClass().getResource("view/sample.fxml"));
primaryStage.setTitle("form");
primaryStage.setScene(new Scene(root, 600, 600));
我期望能够从 sample.fxml 中访问 ComboBox 'country_list' 并将其显示在我现有的场景中,因此这就是我的目标。我是 Java 和 FXML 的新手,所以答案可能很明显,但我已经坚持了一两天了。对任何错误的格式表示歉意;这是我第一次使用 SO。
如果有人有空闲时间,我还有一个问题。 getISOCountries() 是查询国籍时使用的最佳 Locale 方法吗?我注意到在询问国籍/国家/地区时,它比表格往往有更多的选择,而且它也不完全按字母顺序排列。提前谢谢大家。
在浏览了一些关于类似问题的其他 SO 问题后,我设法弄明白了。我在 FXML 中创建了一个 HBox,如下所示:
<HBox
id="country_container"
fx:id="country_container"
GridPane.columnIndex="1"
GridPane.rowIndex="12"
/>
它只是用作组合框的容器。然后我在控制器的 Initialize 方法中执行了以下操作:
countries_combo();
combo_box.getChildren().add(country_list);
第一行调用一个方法来创建和 returns ComboBox,第二行将其作为子项添加到手动创建的 HBox 中。
我正在为一个学校项目制作一个仅使用 Java 和 FXML 的应用程序。我不允许使用场景生成器。在应用程序中,用户将他们的信息输入到表单中。然后使用此信息创建三个可能 classes 之一的实例。表单的字段之一是 'Nationality',因此我想使用包含国家/地区的下拉列表供他们选择。在 MBec 对这个问题的回答的帮助下,我在我的 Main.java class(它最初在我的控制器中)中创建了一个 ComboBox:
我的问题是:如何从我的 FXML 文件中访问我在 Main.java 中制作的 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);
我尝试在 FXML 中创建的空 ComboBox 上设置 onAction 属性,方法是创建然后从 Main.java 返回填充的 ComboBox,但正如预期的那样,这不起作用。
我确实通过将 ComboBox 设置为新场景的根来验证其是否正常工作。这只是为了确保 ComboBox 本身不是问题的原因。用于测试的新场景:
我也尝试过以不同的方式制作 ComboBox(请在此处查看 Keyuri Bhanderi 的回答:
我现有场景的代码:
Parent root = FXMLLoader.load(getClass().getResource("view/sample.fxml"));
primaryStage.setTitle("form");
primaryStage.setScene(new Scene(root, 600, 600));
我期望能够从 sample.fxml 中访问 ComboBox 'country_list' 并将其显示在我现有的场景中,因此这就是我的目标。我是 Java 和 FXML 的新手,所以答案可能很明显,但我已经坚持了一两天了。对任何错误的格式表示歉意;这是我第一次使用 SO。 如果有人有空闲时间,我还有一个问题。 getISOCountries() 是查询国籍时使用的最佳 Locale 方法吗?我注意到在询问国籍/国家/地区时,它比表格往往有更多的选择,而且它也不完全按字母顺序排列。提前谢谢大家。
在浏览了一些关于类似问题的其他 SO 问题后,我设法弄明白了。我在 FXML 中创建了一个 HBox,如下所示:
<HBox
id="country_container"
fx:id="country_container"
GridPane.columnIndex="1"
GridPane.rowIndex="12"
/>
它只是用作组合框的容器。然后我在控制器的 Initialize 方法中执行了以下操作:
countries_combo();
combo_box.getChildren().add(country_list);
第一行调用一个方法来创建和 returns ComboBox,第二行将其作为子项添加到手动创建的 HBox 中。