【发布时间】:2017-05-25 12:35:00
【问题描述】:
假设我有两个 FXML 文件:主文件和一个包含自定义组件的文件。我想从自定义控制器访问主文件组件,如下所示:
Main.fxml:
<FlowPane>
<children>
<TextField fx:id="source" />
<CustomBox fx:id="cbox" />
</children>
</FlowPane>
自定义.fxml:
<fx:root type="HBox">
<children>
<Button fx:id="showButton" onAction="#show" text="Show" />
</children>
</fx:root>
CustomBox.java:
public class CustomBox extends HBox {
@FXML
private TextField source;
public CustomBox() {
FXMLLoader loader = new FXMLLoader(getClass().getResource("Custom.fxml"));
loader.setRoot(this);
loader.setController(this);
try {
loader.load();
} catch (IOException e) {
e.printStackTrace();
}
}
@FXML
protected void show() {
System.out.println(source.getText());
}
}
但是 show() 方法给了我 NPE。如何绑定来自不同文件的组件和控制器?
【问题讨论】:
-
您不能将一个 FXML 文件中定义的控件注入到另一个 FXML 文件的控制器中 - 通常,将控件暴露在定义它们的 FXML 的控制器之外是不好的做法。相反,将主控制器的引用传递给自定义组件,并调用主控制器上的方法来检索文本(或使用 MVC 方法并定义模型类,并与两个控制器共享模型的实例)。