gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 11:21:06 25 4
gpt4 key购买 nike

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

<MyControl myNumber="123" />

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

问题似乎是在启动时我似乎无法访问 123 的更新值。我在运行构造函数时没有它(预期),但在运行控件的 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

这种情况如何解决?

最佳答案

如果您想在 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);
}

关于java - FXML 声明的自定义控件无法在初始化时访问声明的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49915909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com