将枚举值绑定到 FXML 中的 Combox
Bind enum values to Combox in FXML
我有一个 JavaFX 应用程序,我正在尝试将一个枚举的所有值从 FXML 映射到一个组合框。
像下面这样的东西工作得很好,但是,我正在寻找一个更通用的解决方案,我不需要手动列出枚举的所有可能值。
<ComboBox>
<items>
<FXCollections fx:factory="observableArrayList">
<MyEnum fx:constant="VALUE1"/>
<MyEnum fx:constant="VALUE2"/>
</FXCollections>
</items>
</ComboBox>
如果没有一些额外的代码,这是不可能的,因为没有办法一次将多个对象添加到列表中,也不可能初始化列表。
不过,您可以创建一个提供 static
getter/setter 方法的助手 class。此方法可以使用反射来添加枚举常量:
public class EnumUtil {
/* getter needed for FXMLLoader */
public static Class<?> getEnumClass(ObservableList list) {
return list.isEmpty() ? null : list.get(0).getClass();
}
public static <T extends Enum<T>> void setEnumClass(ObservableList<? super T> list, Class<T> enumClass) {
if (!enumClass.isEnum()) {
throw new IllegalArgumentException(enumClass.getName() + " is not a enum type");
}
list.addAll(enumClass.getEnumConstants());
}
}
fxml
<ComboBox>
<items>
<!-- fill combobox with constants from KeyCode -->
<FXCollections fx:factory="observableArrayList" EnumUtil.enumClass="javafx.scene.input.KeyCode"/>
</items>
</ComboBox>
我有一个 JavaFX 应用程序,我正在尝试将一个枚举的所有值从 FXML 映射到一个组合框。
像下面这样的东西工作得很好,但是,我正在寻找一个更通用的解决方案,我不需要手动列出枚举的所有可能值。
<ComboBox>
<items>
<FXCollections fx:factory="observableArrayList">
<MyEnum fx:constant="VALUE1"/>
<MyEnum fx:constant="VALUE2"/>
</FXCollections>
</items>
</ComboBox>
如果没有一些额外的代码,这是不可能的,因为没有办法一次将多个对象添加到列表中,也不可能初始化列表。
不过,您可以创建一个提供 static
getter/setter 方法的助手 class。此方法可以使用反射来添加枚举常量:
public class EnumUtil {
/* getter needed for FXMLLoader */
public static Class<?> getEnumClass(ObservableList list) {
return list.isEmpty() ? null : list.get(0).getClass();
}
public static <T extends Enum<T>> void setEnumClass(ObservableList<? super T> list, Class<T> enumClass) {
if (!enumClass.isEnum()) {
throw new IllegalArgumentException(enumClass.getName() + " is not a enum type");
}
list.addAll(enumClass.getEnumConstants());
}
}
fxml
<ComboBox>
<items>
<!-- fill combobox with constants from KeyCode -->
<FXCollections fx:factory="observableArrayList" EnumUtil.enumClass="javafx.scene.input.KeyCode"/>
</items>
</ComboBox>