将枚举值绑定到 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>