为了简单起见,我们假设我有一个FXML
和一个SplitPane
。一方面,我有一个按钮;另一个有一个空的AnchorPane
(目前)。
该按钮仅将窗格放在另一个SplitPane
文件的FXML
的另一侧。新添加的窗格包含一个按钮和一个标签。两个FXML
具有相同的控制器,有两个原因:1.添加的窗格FXML
在其他地方未使用; 2。添加的窗格FXML
的功能太少,以至于不值得为此有一个单独的控制器。
按下新添加的窗格上的按钮会将其标签中的文本设置为"Hello World"
。
拆分窗格
<SplitPane fx:controller="myController".... >
<items>
<VBox .... >
<Button fx:id="mainButton" onAction="#handleFirstButton".... />
</VBox>
<AnchorPane fx:id="secondPane" ....>
</items>
</SplitPane>
已添加窗格
<VBox fx:controller="myController" ....>
<Button fx:id="btn" onAction="#changeText" ... />
<Label fx:id="lbl" .... />
</VBox>
控制器类
// Regular stuff here
@FXML
AnchorPane secondPane;
@FXML
Button mainButton;
@FXML
Button btn;
@FXML
Label lbl;
public void initialize(URL arg0, ResourceBundle arg1) {
}
private void loadSecondPane {
FXMLLoader loader = FXMLLoader.load(getClass().getResource("AddedPane.fxml"));
VBox box = loader.load();
secondPane.setTopAnchor(box);
}
@FXML
private void handleFirstButton(ActionEvent event) {
loadSecondPane();
}
@FXML
private void changeText(ActionEvent event) {
lbl.setText("Hello World");
}
问题是,当加载“添加的窗格”时,将不会在控制器中定义其组件,并且尝试对其执行任何方法将产生NullPointerException
。
在这种情况下是否可以解决?还是必须使用单独的控制器?并假设我在窗格的第一侧有2个以上的按钮,而每个按钮在另一侧又产生了一个不同的窗格,解决方案是否保持不变?
注意:我对javafx还是很陌生,所以请原谅任何错误的类型。