所以,这是我的主要FXML文件,名为'Home.fxml':
<VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="700.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1">
<fx:include source="MenuBar.fxml" />
<Label alignment="CENTER" maxWidth="1.7976931348623157E308" text="Welcome to MSMusic" textAlignment="CENTER">
<font>
<Font size="62.0" />
</font>
</Label>
<fx:include source="PlayerElement.fxml" />
</VBox>
在该文件中我包含一个音乐播放器元素,其中有一个带有fx:id'songTime'的标签,当我尝试在Home.fxml的Controller中使用'songTime'时,我得到一个NullPointerException,因为fx:嵌套fxml中的id似乎不可用。有没有一种简单的方法来实现这一目标?
答案 0 :(得分:4)
在控制器外部为发生它们的FXML文件公开UI控件通常是不好的做法。
您可以将附带的FXML文件中的控制器插入到Home.fxml
文件的控制器中:
<VBox maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="700.0" xmlns="http://javafx.com/javafx/8.0.60" xmlns:fx="http://javafx.com/fxml/1">
<fx:include source="MenuBar.fxml" />
<Label alignment="CENTER" maxWidth="1.7976931348623157E308" text="Welcome to MSMusic" textAlignment="CENTER">
<font>
<Font size="62.0" />
</font>
</Label>
<fx:include fx:id="player" source="PlayerElement.fxml" />
</VBox>
在Home.fxml
的控制器中,您可以
public class HomeController {
@FXML
private PlayerElementController playerController ;
// ...
}
其中PlayerElementController
是PlayerElement.fxml
文件的控制器类。这在"Nested Controllers" in the documentation下进行了描述,但实质上只是使用了一个名称为fx:id
的字段,其fx:include
附加了"Controller"
,因此fx:id="player"
为playerController
include允许您将包含的FXML文件的控制器实例注入字段PlayerElementController
。
现在只需在public class PlayerElementController {
@FXML
private Label songTime ;
// note: might want to make the parameter a more appropriate type than string,
// and perform the conversion to a string in this method...
public void setSongTime(String songTime) {
this.songTime.setText(songTime);
}
// and similarly here for the return type
public String getSongTime() {
return songTime.getText();
}
// ...
}
中定义一些方法来设置所需的文字:
HomeController
现在回到playerController.setSongTime(...);
,您需要做的就是
&T{}
设置文字。如果您需要与标签关联的其他功能,只需定义与您需要的行为相对应的适当方法。