我正在使用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
如何解决这种情况?
答案 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);
}