カスタムコンポーネントTableBlockを作成しました。 LabelとTableViewで構成されています。 TableViewには、たとえば、1〜1000行があります。行数は、FXMLファイルのパラメータ "rowsFromPrefs"によって定義されます。このパラメータは、TableViewの作成に必要です。 TableViewは、JAVAコードによって完全に作成されています.fxmlはタグとパラメータであり、いくつかの行があります。カスタムjavafxコンポーネントのパラメータとしてカスタムFXMLプロパティを設定します
私が知っているように、JavaFXはFXMLコンポーネントを構築するとき、最初にコンストラクタを呼び出し、次に@FXML注釈付きフィールドを呼び出し、initialize()メソッドを開始します。
私の場合、initialize()が開始されると、変数rowsFromPrefsはまだnullです!しかし、もし私が他のスレッド(JavaFXランチャーではない)からrowsFromPrefsの値を取得しようとすると、定義されていることがわかります。
私は、JavaがFXMLファイルからオブジェクトのパラメータをどの瞬間に割り当てるのか分からない。 fxmlファイルからオブジェクトにパラメータを渡すにはどうすればいいですか?
コンストラクタパラメータに@NamedArgアノテーションが見られました。オブジェクトが作成されているときにパラメータを渡す唯一の方法ですか?
コントローラが一度に呼び出される初期化()メソッド、>その関連ドキュメントの内容>が完全にロードされた実装コントローラ定義できる:
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>
詳細な説明はありがとうございます。私は思いますが、NamedArgは適切な解決策です。 – LazerJet