在FXML中传递枚举

时间:2015-07-09 18:06:40

标签: java javafx fxml

我正在制作自定义FXML组件。我想要做的是将Enum传递给组件,以便它可以从Enum中检索所有值。以下是自定义组件的片段:

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

1 个答案:

答案 0 :(得分:4)

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

<MyCustomValues/>

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

理想情况下,你想在这里传递实际的Class对象本身,但由于我无法在FXML中实例化Class<?>,我认为你能做的最好就是通过班级的名称。例如:

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)。