【问题标题】:Populating JavaFX ComboBox or ChoiceBox from enum从枚举填充 JavaFX ComboBox 或 ChoiceBox
【发布时间】:2025-11-24 00:10:01
【问题描述】:

有没有办法用枚举的所有枚举来填充 JavaFX ComboBoxChoiceBox

这是我尝试过的:

public class Test {

    public enum Status {
        ENABLED("enabled"),
        DISABLED("disabled"),
        UNDEFINED("undefined");

        private String label;

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

        public String toString() {
            return label;
        }
    }
}

在另一个类中,我正在尝试填充 ComboBox

    ComboBox<Test.Status> cbxStatus = new ComboBox<>();
    cbxStatus.setItems(Test.Status.values());

但我得到一个错误:incompatible types: Status[] cannot be converted to ObservableList&lt;Status&gt;

ChoiceBox 显然有同样的问题。

【问题讨论】:

    标签: java combobox enums javafx


    【解决方案1】:

    如果 setItems 需要一个 ObservableList,那么你必须给它一个而不是一个数组。

    试试这个:

    ComboBox<Status> cbxStatus = new ComboBox<>();
    cbxStatus.setItems( FXCollections.observableArrayList( Status.values()));
    

    编辑:James_D 的解决方案(见评论)是首选:

    cbxStatus.getItems().setAll(Status.values());
    

    【讨论】:

    • cbxStatus.getItems().setAll(Status.values());
    • 哦,是的,那个更好:D
    • James_D 解决方案是我的选择!谢谢
    • 有什么方法可以从 FXML 做到这一点?
    • 这并没有太大的区别,但cbxStatus.getItems().setAll(Arrays.asList(Status.values())); 将避免显示“可变参数方法的非可变参数调用”的警告。
    【解决方案2】:

    我为此使用了 FXML。我的枚举有一个构造函数

    <ComboBox GridPane.rowIndex="0" GridPane.columnIndex="1">
            <items>
                <FXCollections fx:factory="observableArrayList">
                    <Type fx:value="ABC"/>
                    <Type fx:value="DEF"/>
                    <Type fx:value="GHI"/>
                </FXCollections>
            </items>
        </ComboBox>
    

    public enum Type {
    
        ABC("abc"),DEF("def"),GHI("ghi");
    
        private String name;
    
        private Type(String theType) {
            this.name = theType;
        }
    
    }
    

    【讨论】:

    • 可以说更优雅的解决方案是使用fx:constant,因此它直接引用枚举值而不是依赖于静态valueOf 方法。一些编辑器甚至可能在使用fx:constant 时提供补全。