如何从父组件的子组件访问其控制器?JavaFX 8.



我正在尝试使用FXML在JavaFX中构建GUI。 为此,我有一个主 FXML 页面,其中包含我也使用 FXML 创建的 3 个自定义组件。 这是我的代码目录:

src
App.java
ui
MainView.java
CustomHeader.java
CustomBody.java
fxml
MainView.fxml
CustomHeader.fxml
CustomBody.fxml
controller
MainViewController.java
CustomHeaderController.java
CustomBodyController.java

应用.java

package ui;
import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import model.main.TaskItem;
import java.time.LocalDateTime;
import java.util.ArrayList;
public class ProductivityTrackerApp extends Application {
public static Stage primaryStage;
public static final String TITLE = "App";
public static final double WIDTH = 520;
public static final double HEIGHT = 800;
public static void main(String[] args) {
launch(args);
}
public void setPrimaryStage(Stage primaryStage) {
this.primaryStage = primaryStage;
}
public static void setScene(Parent root) {
try {
Scene scene = new Scene(root, WIDTH, HEIGHT);
primaryStage.setTitle(TITLE);
primaryStage.setScene(scene);
primaryStage.show();
} catch (Exception e) {
System.out.println("Failed to load new Scene!");
}
}
@Override
public void start(Stage primaryStage) throws Exception {
setPrimaryStage(primaryStage);
setScene(new MainView());
}
}

Main.fxml

<fx:root xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="controllers.MainController"
fx:id="root"
type="VBox">
<children>
<CustomHeader> </CustomHeader>
<CustomBody> </CustomBody>
</children>
</fx:root>

主视图.java

package ui;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.VBox;
import java.io.File;
import java.io.IOException;
public class MainView extends VBox {
private static final String FXML = "src/fxml/MainView.fxml";
private File fxmlFile = new File(FXML);
public MainView() {
this.load();
};
private void load() {
try {
FXMLLoader fxmlLoader = new FXMLLoader(fxmlFile.toURI().toURL());
fxmlLoader.setRoot(this);
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
}

CustomHeader.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<fx:root xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="controllers.CustomHeaderController"
minHeight="80.0" prefWidth="520.0" type="StackPane">
<BorderPane>
<left>
</left>
<center>
<Label text="App"/>
</center>
<right>
<Button text="Click here" onMouseClicked="#colorBody"/>
</right>
</BorderPane>
</fx:root>

自定义标头.java

package ui;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.StackPane;
import java.io.File;
import java.io.IOException;
public class MainView extends StackPane {
private static final String FXML = "src/fxml/CustomHeader.fxml";
private File fxmlFile = new File(FXML);
public CustomHeader() {
this.load();
};
private void load() {
try {
FXMLLoader fxmlLoader = new FXMLLoader(fxmlFile.toURI().toURL());
fxmlLoader.setRoot(this);
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
}

CustomBody.fxml


<fx:root xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="controllers.CustomBodyController"
type="StackPane">
<Rectangle width="240" height="240" StackPane.alignment = "CENTER"/>
</fx:root>

定制车身.java

package ui;
import javafx.fxml.FXMLLoader;
import javafx.scene.layout.StackPane;
import java.io.File;
import java.io.IOException;
public class MainView extends StackPane {
private static final String FXML = "src/fxml/CustomBody.fxml";
private File fxmlFile = new File(FXML);
public CustomBody() {
this.load();
};
private void load() {
try {
FXMLLoader fxmlLoader = new FXMLLoader(fxmlFile.toURI().toURL());
fxmlLoader.setRoot(this);
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
}

控制器尚无功能。 因此,我没有包括它们。

我想介绍一个功能,使自定义标头组件中按钮上的 onClick 操作更改自定义正文组件中矩形的颜色。 但是,由于这些组件具有单独的控制器,我想知道是否有办法从主控制器(父组件的控制器(访问这两个控制器。 此外,如果可能的话,是否有更好的建议来调解两个兄弟组件的通信?

<CustomHeader fx:id="customHead"> </CustomHeader>

在 fxm 文件中添加一个变量

public CustomHead customHead;

在主控制器中。

最新更新