Привязать значения перечисления к Combox в FXML - PullRequest
0 голосов
/ 26 августа 2018

У меня есть приложение JavaFX, и я пытаюсь отобразить все значения перечисления в Combobox из FXML.

Нечто похожее на приведенное ниже работает просто отлично, однако я ищу более общее решение, в котором мне не нужно перечислять все возможные значения перечисления вручную.

<ComboBox>
     <items>
         <FXCollections fx:factory="observableArrayList">
              <MyEnum fx:constant="VALUE1"/>
              <MyEnum fx:constant="VALUE2"/>
          </FXCollections>
     </items>
</ComboBox>

1 Ответ

0 голосов
/ 26 августа 2018

Это невозможно без дополнительного кода, поскольку невозможно добавить несколько объектов в список одновременно, а инициализация списка также невозможна.

Вы можете создать вспомогательный класс, обеспечивающий static методы получения / установки хотя.Этот метод может использовать отражение, чтобы добавить константы перечисления:

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>
...