【发布时间】:2023-04-08 23:37:01
【问题描述】:
我创建了自定义组件 TableBlock。它由Label 和TableView 组成。例如,TableView 可以有 1 到 1000 行。行数由 FXML 文件中的参数“rowsFromPrefs”定义。创建 TableView 需要此参数。 TableView 完全由 JAva 代码创建,在 fxml 中只是它的标签和参数,带有许多行。
据我所知,JavaFX 在构造 FXML 组件时,首先调用构造函数,然后调用 @FXML 注释字段,然后启动 initialize() 方法。
在我的例子中,当 initialize() 启动时,变量 rowsFromPrefs 仍然为空!但是,如果我尝试从其他线程(不是 JavaFX 启动器)获取 rowsFromPrefs 的值,我会看到它定义了 =“2”,就像它应该的那样。
所以我无法理解 Java 在什么时候从 FXML 文件中分配对象参数。创建对象时如何将参数从 fxml 文件传递给对象。
我看到了构造函数参数的@NamedArg 注释。创建对象时是否只有一种传递参数的方式?
控制器可以定义一个initialize()方法,当其相关文档的内容已经完全加载时,将在一个实现控制器上调用一次:
TableBlock.java
public class TableBlock extends VBox{
@FXML
private String rowsFromPrefs;
@FXML
private Label label;
public TableBlock() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("TableBlock.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
@FXML
public void initialize() {
this.table = createTable(rowsFromPrefs);
}
public String getRowsFromPrefs() {
System.out.println("getRowsFromPrefs");
return rowsFromPrefs;
}
public void setRowsFromPrefs(String rowsFromPrefs) {
this.rowsFromPrefs = rowsFromPrefs;
}
}
TableBlock.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import ru.laz.model.controls.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.AnchorPane?>
<?import ru.laz.model.controls.tableblock.*?>
<fx:root type="javafx.scene.layout.VBox" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Label text="Label" />
</children>
</fx:root>
View.java
public class View extends Application {
Parent root = null;
private Scene scene;
@Override
public void init() {
try {
root = FXMLLoader.load(getClass().getResource("View.fxml"));
root.requestLayout();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void start(final Stage stage) throws Exception {
scene = new Scene(root, 640, 480, Color.LIGHTGRAY);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}
View.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.*?>
<?import ru.laz.model.controls.tableblock.*?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<TableBlock rowsFromPrefs="2" id="IDDQD"/>
</children>
</AnchorPane>
【问题讨论】: