簡體   English   中英

JavaFX:在運行時加載FXML並與控制器通信

[英]JavaFX: loading FXML at runtime and communicating with controllers

我在FXML文件中有一個容器(我們稱其為帶主控制器的主容器),並且正在嘗試生成其他FXML創建的節點,並將其作為子容器添加到主容器中。

我不認為我可以通過嵌套FXML來做到這一點,因為將節點添加到需要函數調用的自定義組件中。 我以為我可以在主控制器的初始化中加載節點,但這會導致堆棧溢出,因為加載會遞歸調用初始化函數。

最好的方法是什么? 我希望能夠使主控制器響應並設置節點。 我可以

主控制器看起來像:

public class MainController implements Initializable {

    @FXML
    private CardPane cardPane;
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // setup panes
        AnchorPane importPane = new AnchorPane();
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("ImportPane.fxml"));
        fxmlLoader.setRoot(importPane);
        fxmlLoader.setController(this);

        try {
            fxmlLoader.load();
            cardPane.addCard(importPane);
        } catch (IOException exception) {
            throw new RuntimeException(exception);
    }

}

CardPane是自定義組件類,其中addCard添加一個節點(CardLayout的實現)。

ImportPane的FXML現在幾乎是空的。 我只是為根類提供了CSS樣式,因此我可以看到它的布局。

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.net.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<fx:root id="AnchorPane" prefHeight="400.0" prefWidth="600.0" styleClass="mainFxmlClass" type="AnchorPane" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8.0.40">
    <stylesheets>
        <URL value="@view.css" />
    </stylesheets>
   <children>
      <VBox alignment="CENTER" layoutX="121.0" layoutY="38.0" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" styleClass="importPane" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
   </children>
</fx:root>

主要組件的FXML是:

<?xml version="1.0" encoding="UTF-8"?>

<?import cardPane.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" stylesheets="@PHASIQAnalyzerView.css" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1" fx:controller="phasiqplateanalyzer.PHASIQAnalyzerController">
   <children>
      <VBox alignment="CENTER" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <HBox id="buttonBar" alignment="CENTER" maxHeight="-Infinity" maxWidth="1.7976931348623157E308" minWidth="-Infinity" prefHeight="100.0" prefWidth="200.0" />
            <CardPane id="mainPane" fx:id="cardPane" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" VBox.vgrow="ALWAYS" />
         </children>
      </VBox>
   </children>
</AnchorPane>

從FXML中刪除fx:controller="phasiqplateanalyzer.PHASIQAnalyzerController"並使用FXMLLoader對象的setController()方法(對此無靜態方法調用...)

https://docs.oracle.com/javase/8/javafx/api/javafx/fxml/FXMLLoader.html#setController-java.lang.Object-

FXMLLoader fxmlLoader =new  FXMLLoader();
fxmlLoader.setController(yourControllerClass);
fxmlLoader.load("yourFxmlFile");

暫無
暫無

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

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