JavaFX - 从嵌套的FXML访问fx:id

时间:2016-11-28 01:44:41

标签: java javafx view controller fxml

所以,这是我的主要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似乎不可用。有没有一种简单的方法来实现这一目标?

1 个答案:

答案 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 ;

    // ...
}

其中PlayerElementControllerPlayerElement.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{}

设置文字。如果您需要与标签关联的其他功能,只需定义与您需要的行为相对应的适当方法。