簡體   English   中英

JavaFX-從嵌套FXML訪問fx:id

[英]JavaFX - Access fx:id from nested 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:id來自內部嵌套的fxml似乎不可用。 有沒有簡單的方法可以做到這一點?

通常,對於在其中出現UI的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文件的控制器類。 在文檔的“嵌套控制器”下進行了描述 ,但實際上僅使用名稱為fx:id的字段作為fx:include並附加了"Controller" ,因此此處的fx:id="player"包括允許您將包含的FXML文件的控制器實例注入到字段playerController

現在,只需在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(...);

設置文本。 如果需要與標簽關聯的其他功能,只需定義與所需行為對應的適當方法即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM