【问题标题】:What is the best practice to show and create an enum using UI in JavaFX?在 JavaFX 中使用 UI 显示和创建枚举的最佳实践是什么?
【发布时间】:2017-02-24 11:15:59
【问题描述】:

我有一个带有ComboBox 的表单,我想填充MyEnum 类型的可用值:

public enum MyEnum {
  FIRST_CHOICE ("First choice"),
  SECOND_CHOICE ("Second choice");

  private String value;

  MyEnum(String value) {
    this.value = value;
  }

  public String toString() {
    return value;
  }
}

myComboBox.getItems().setAll(MyEnum.values());

然后,在做出选择并点击按钮之后,我想创建一个新的MyEnum 对象。我想出的想法是:

选项 1:

从 ComboBox 中获取值并使用 switch 语句,针对所采取的选择创建一个新的 MyEnum

选项 2:

使字符串值与枚举值相同,并使用valueOf() 创建MyEnum

public enum MyEnum {
  FIRST_CHOICE ("FIRST_CHOICE"),
  SECOND_CHOICE ("FIRST_CHOICE");

  ...
}

MyEnum myEnum = MyEnum.valueOf(myComboBox.getSelectionModel().getSelectedItem())

---------

所以第一个选项很糟糕,我知道。第二个稍微好一点,但不是那么用户友好(因为他会看到像“FIRST_CHOICE”这样的文字),我想还有更好的选择。我想以最好的方式做到这一点,尽可能地分离视图和模型,但我完全不知道如何实现。

【问题讨论】:

  • valueOf 不会创建新的枚举常量。它返回现有的...

标签: java model-view-controller javafx


【解决方案1】:

我会选择“选项 3”,并使用 StringConverter。这将允许您在“幕后”使用枚举,同时向用户显示更合适的字符串。这也将允许在不同情况下使用不同的字符串,例如国际化,或相同基础类型之上的不同组合框。

这里我以 case 语句为例,但可以从属性文件等中查找值。

ComboBox<MyEnum> myComboBox = new ComboBox<>();
myComboBox.getItems().setAll(MyEnum.values());
myComboBox.setConverter(new StringConverter<MyEnum>() {

    @Override
    public String toString(MyEnum object) {
        switch (object) {
        case FIRST_CHOICE:
            return "foo";
        case SECOND_CHOICE:
            return "bar";
        default:
            break;
        }
        return null;
    }

    @Override
    public MyEnum fromString(String string) {
        return null;
    }
});

ComboBox 返回的值仍然是 MyEnum 类型,这可以通过

来证明
myComboBox.valueProperty().addListener((obs, oldValue, newValue) -> {
    System.out.println(myComboBox.getValue());
});

输出

SECOND_CHOICE
FIRST_CHOICE

【讨论】:

  • 好的,但是当做出选择时,如何使用此选项创建枚举?我仍然必须使用 switch(关于fromString() 方法)
  • @notmyf4ulty myComboBox.getValue();将返回枚举,仅用于 UI 的字符串转换器...我将更新答案以反映这一点...
  • 哦,现在我明白了!只是没有注意到&lt;MyEnum&gt;。很好的答案,谢谢。
  • @notmyf4ulty 请注意关于 myComboBox.getValue() 返回枚举的评论也适用于您的“选项 1”,但这更简洁,因为它将显示(在转换器中)与数据的表示分离(在枚举中)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多