JavaFx 元素未绑定到 fx:id 上的控制器变量
JavaFx element not binding to controller variable on fx:id
这可能是飞行员错误,但 FXML 属性未绑定到 fx:id 上的控制器 class。我已将其缩减为一个微不足道的示例,但仍然 "no joy"。我忽略了什么?
FXML 文件...
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane fx:id="mainFrame" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.controller.BorderPaneCtrl">
<left>
<AnchorPane fx:id="anchorPaneLeft" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
</left>
</BorderPane>
关联的 Java 代码是...
package sample.controller;
import javafx.fxml.FXML;
import javafx.scene.layout.AnchorPane;
public class BorderPaneCtrl {
@FXML private AnchorPane anchorPaneLeft;
public BorderPaneCtrl() {
/* so, @FXML-annotated variables are accessible, but not
* yet populated
*/
if (anchorPaneLeft == null) {
System.out.println("anchorPaneLeft is null");
}
}
/* this is what was missing...added for "completeness"
*/
@FXML
public void initialize() {
/* anchorPaneLeft has now been populated, so it's now
* usable
*/
if (anchorPaneLeft != null) {
// do cool stuff
}
}
自负在这里不是问题,我很确定我忽略了一些简单的事情。
构造函数中尚未分配 FXML 元素,但您可以在已分配元素的地方使用 Initializable 接口。
public class Controller implements Initializable {
@FXML
AnchorPane anchorPaneLeft;
public Controller() {
System.out.println(anchorPaneLeft); //null
}
@Override
public void initialize(URL location, ResourceBundle resources) {
System.out.println(anchorPaneLeft); //AnchorPane
}
}
我假设您知道应该使用 FXML 创建控制器,例如:FXMLLoader.load(getClass().getResource("sample.fxml");
这可能是飞行员错误,但 FXML 属性未绑定到 fx:id 上的控制器 class。我已将其缩减为一个微不足道的示例,但仍然 "no joy"。我忽略了什么?
FXML 文件...
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane fx:id="mainFrame" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.controller.BorderPaneCtrl">
<left>
<AnchorPane fx:id="anchorPaneLeft" prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
</left>
</BorderPane>
关联的 Java 代码是...
package sample.controller;
import javafx.fxml.FXML;
import javafx.scene.layout.AnchorPane;
public class BorderPaneCtrl {
@FXML private AnchorPane anchorPaneLeft;
public BorderPaneCtrl() {
/* so, @FXML-annotated variables are accessible, but not
* yet populated
*/
if (anchorPaneLeft == null) {
System.out.println("anchorPaneLeft is null");
}
}
/* this is what was missing...added for "completeness"
*/
@FXML
public void initialize() {
/* anchorPaneLeft has now been populated, so it's now
* usable
*/
if (anchorPaneLeft != null) {
// do cool stuff
}
}
自负在这里不是问题,我很确定我忽略了一些简单的事情。
构造函数中尚未分配 FXML 元素,但您可以在已分配元素的地方使用 Initializable 接口。
public class Controller implements Initializable {
@FXML
AnchorPane anchorPaneLeft;
public Controller() {
System.out.println(anchorPaneLeft); //null
}
@Override
public void initialize(URL location, ResourceBundle resources) {
System.out.println(anchorPaneLeft); //AnchorPane
}
}
我假设您知道应该使用 FXML 创建控制器,例如:FXMLLoader.load(getClass().getResource("sample.fxml");