【问题标题】:Pass Enum in FXML在 FXML 中传递枚举
【发布时间】:2015-07-10 02:26:00
【问题描述】:

我正在制作一个自定义 FXML 组件。我想做的是将枚举传递给组件,以便它可以从枚举中检索所有值。这是自定义组件的 sn-p:

public ChoiceBoxSetting(@NamedArg("values") Enum values) {
    choiceBox.getItems().setAll(values.getDeclaringClass().getEnumConstants());

这是创建它的 FXML:

<ChoiceBoxSetting>
    <values>
        <MyCustomValues/>
    </values>
</ChoiceBoxSetting>

这里是MyCustomValues 枚举:

public enum MyCustomValues {
    HI, HELLO, ME
}

所以当我运行它时,我得到了这个异常:

Caused by: javafx.fxml.LoadException: MyCustomValues is not a valid type.

我正在尝试传递它自己的枚举,不是枚举值之一,例如MyCustomValues.HI

【问题讨论】:

    标签: java javafx fxml


    【解决方案1】:

    名称与类名对应的元素是指向FXMLLoader 的指令,用于实例化该类;所以

    <MyCustomValues/>
    

    将导致FXMLLoader 尝试调用new MyCustomValues(),这当然不能用于枚举类型。

    理想情况下,您希望在此处传递实际的 Class 对象本身,但我看不到在 FXML 中实例化 Class&lt;?&gt; 的方法,我认为您能做的最好的事情就是传递班级。例如:

    package application;
    
    import javafx.beans.NamedArg;
    import javafx.scene.control.ChoiceBox;
    
    public class EnumChoiceBox<E extends Enum<E>> extends ChoiceBox<E> {
    
        public EnumChoiceBox(@NamedArg("enumType") String enumType) throws Exception {
            Class<E> enumClass = (Class<E>) Class.forName(enumType);
            getItems().setAll(enumClass.getEnumConstants());
        }
    }
    

    然后你可以这样做:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <?import javafx.scene.layout.StackPane?>
    <?import application.EnumChoiceBox?>
    
    <StackPane xmlns:fx="http://javafx.com/fxml/1">
        <EnumChoiceBox enumType="application.MyCustomValues"/>
    </StackPane>
    

    (将application替换为实际的包名MyCustomValues)。

    【讨论】:

    • 很遗憾你不能通过Class,但这很有效。谢谢!
    • 好吧,即使你可以,你可以在 FXML 中创建一个的唯一方法是将类名指定为String,所以你真的没有损失太多。如果需要,您可以定义一个重载的构造函数,该构造函数采用 Class&lt;E extends Enum&lt;E&gt;&gt; 以供 Java 代码使用。
    猜你喜欢
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多