如何使用绑定枚举设置 RadioButtonGroup 的标签

How to set Labels of RadioButtonGroup with bound Enum

我有一个 RadioButtonGroup<MyEnum> 并且我用枚举设置了项目。单个项目的标签现在是我的枚举的元素。由于代码约定,我的 Enum 元素写得很大。我向我的枚举添加了一个 public String getText(MyEnum e) 方法,我希望 RadioButtonGroup 的标签是这些文本。

我还有几个组合框,它们的元素也来自枚举。 ComboBoxes 有一个方法 setItemLabelGenerator(),我可以用它来将我的枚举元素文本表示设置为标签。

我的枚举

public enum MyEnum{
    OPT1, OPT2, OPT3;

    public static String getText(MyEnum e) {
        switch(e) {
            case OPT1:  return "Option 1";
            case OPT2:  return "Option 2";
            case OPT3:  return "Option 3";
        }
        return "";
    }

    public static Collection<MyEnum > getValues(){
        Collection<MyEnum > resultList = new ArrayList<MyEnum >();
        resultList.add(OPT1);
        resultList.add(OPT2);
        resultList.add(OPT3);
    }
}

在我的 UI class 中,我的 RadioButtonGroup 的 Enum 元素作为项目:

RadioButtonGroup<MyEnum> myRadioGroup= new RadioButtonGroup<MyEnum>();
myRadioGroup.setItems(MyEnum.getValues());

不幸的是,项目的标签是 "OPT1"、"OPT2" 和 "OPT3",但我希望它们是 "Option 1"、"Option 2" 和 "Option 3".

对于我的组合框,我可以使用 setItemLabelGenerator() 方法来获得漂亮的标签:

ComboBox<MyEnum> myBox= new ComboBox<MyEnum>();
myBox.setItems(MyEnum.getValues());
myBox.setItemLabelGenerator(MyEnum::getText);

我的 ComboBox 中的项目是 "Option 1"、"Option 2" 和 "Option 3"。

有人能告诉我,如何获得与 RadioButtonGroups 的 ComboBoxes 一样的结果吗?我希望我的用户在 UI 中看到漂亮的标签 :-)

默认行为是对 ComboBox 中的对象执行 toString。那么,为什么不按照您的期望制作 toString return,或者设置带有 getter 的标签 属性?

enum MyOptions {
    OPT1("Option 1"),
    OPT2("Option 2"),
    OPT3("Option 3");

    private final String label;

    MyOptions(String label) {
        this.label = label;
    }

    // either use getLabel as your item label generator...
    public String getLabel() {
        return this.label;
    }

    // ...or if you don't care about printing in logs etc. 
    //    just override the default toString implementation
    public String toString() {
        return this.label;
    }
}

RadioButtonGroup 没有 setItemLabelGenerator(...),但是你可以用 setRenderer(new TextRenderer<>(...)).

实现同样的效果

所以在这种情况下

myBox.setRenderer(new TextRenderer<>(MyEnum::getText));