FXML声明自定义控件无法在初始化时访问声明的字段

时间:2018-04-19 08:09:36

标签: java javafx fxml fxmlloader

我正在使用JavaFX / FXML开发一个控件,然后可以像这样使用:

<MyControl myNumber="123" />

首次向用户显示时,控件应该使用myNumber

问题似乎是在启动时无处可见我似乎可以访问123的更新值。运行构造函数时我没有这个(可以预期)但是在运行Control initialize()方法时我也没有。

这里是带有一些调试语句的代码:

public class MyControl extends VBox implements Initializable {
    @FXML int myNumber = -1;

    public int getMyNumber() { return myNumber; }

    public void setMyNumber(int myNumber) {
        System.out.println("setMyNumber");
        this.myNumber = myNumber;
    }

    public MyControl() {
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("myControl.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(this);

        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }

        System.out.println("constructor = " + myNumber);
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        System.out.println("initializable = " + myNumber);
    }
}

印刷

initializable = -1
constructor = -1
setMyNumber

如何解决这种情况?

1 个答案:

答案 0 :(得分:1)

如果要在FXML中使用此属性,则应声明带有@NamedArg注释的构造函数。

在您的情况下,这将类似于以下示例:

public MyControl(@NamedArg("myNumber") int pMyNumber) {
    myNumber = pMyNumber;
    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("myControl.fxml"));
    fxmlLoader.setRoot(this);
    fxmlLoader.setController(this);

    try {
        fxmlLoader.load();
    } catch (IOException exception) {
        throw new RuntimeException(exception);
    }
    System.out.println("constructor = " + myNumber);
}