我在FXML文件中有一個容器(讓我們將其稱爲主容器帶有主控制器),並試圖生成其他FXML創建的節點並將它們添加爲子節點主要容器。JavaFX:在運行時加載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>
句法有點不同,但t他的想法是對的。 –
新的初始化工作是: –
// //設置窗格 FXMLLoader mainfxmlLoader = new FXMLLoader(getClass()。getResource(「PHASIQAnalyzerView.fxml」)); mainfxmlLoader.setController(this); AnchorPane importPane = new AnchorPane(); FXMLLoader fxmlLoader = new FXMLLoader(getClass()。getResource(「ImportPane.fxml」)); fxmlLoader.setRoot(importPane); fxmlLoader.setController(this); 嘗試{...' –