JavaFX同时具有多个控制器

JavaFX同时具有多个控制器,java,javafx,Java,Javafx,我正在开发一个JavaFX应用程序,在制作应用程序的“仪表板”时遇到了以下问题。该申请的结构如下: 这是主控制器的菜单或“仪表板”。我遇到的问题是能否将命令从“控制面板”发送到主视图 appFrame和controlPanel的fx:id是显示这些视图的位置。如何让这两个面板(每个面板都有自己的控制器)进行通信 <?xml version="1.0" encoding="UTF-8"?> <?import javafx.geometry.Insets?> <?im

我正在开发一个JavaFX应用程序,在制作应用程序的“仪表板”时遇到了以下问题。该申请的结构如下:

这是主控制器的菜单或“仪表板”。我遇到的问题是能否将命令从“控制面板”发送到主视图

appFrame和controlPanel的fx:id是显示这些视图的位置。如何让这两个面板(每个面板都有自己的控制器)进行通信

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.Cursor?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.effect.DropShadow?>
<?import javafx.scene.image.Image?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<AnchorPane fx:id="parent" prefHeight="600" prefWidth="1024.0" styleClass="parent" stylesheets="@stylesheet.css" xmlns="http://javafx.com/javafx/" xmlns:fx="http://javafx.com/fxml/" fx:controller="main.DashboardController">
    <VBox alignment="TOP_CENTER" prefHeight="600.0" prefWidth="300.0" styleClass="sidebar">
        <Pane prefHeight="75.0" prefWidth="300.0" style="-fx-background-color: #AED6F1#AED6F1;">
            <padding>
                <Insets left="10.0" />
            </padding>

                <ImageView fitHeight="75.0" fitWidth="236.0" layoutX="24.0" layoutY="8.0" pickOnBounds="true" preserveRatio="true">
            <Image url="main/logo.png" /></ImageView>
        </Pane>
        <HBox id="projects" alignment="CENTER_LEFT" layoutX="10.0" layoutY="132.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onMouseClicked="#handleViewChanged" prefHeight="40.0" prefWidth="300.0" styleClass="btns">
            <padding>
                <Insets left="10.0" />
            </padding>
            <cursor>
                <Cursor fx:constant="HAND" />
            </cursor>
            <Label text="Projects" textFill="#7c8184">
                <font>
                    <Font name="Calibri Light" size="15.0" />
                </font>
                <HBox.margin>
                    <Insets left="10.0" />
                </HBox.margin>
            </Label>
        </HBox>
        <HBox id="users" alignment="CENTER_LEFT" layoutX="10.0" layoutY="132.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onMouseClicked="#handleViewChanged" prefHeight="40.0" prefWidth="300.0" styleClass="btns">
            <padding>
                <Insets left="10.0" />
            </padding>
            <cursor>
                <Cursor fx:constant="HAND" />
            </cursor>
            <Label text="Users" textFill="#7c8184">
                <font>
                    <Font name="Calibri Light" size="15.0" />
                </font>
                <HBox.margin>
                    <Insets left="10.0" />
                </HBox.margin>
            </Label>
        </HBox>
        <HBox id="organizations" alignment="CENTER_LEFT" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onMouseClicked="#handleViewChanged" prefHeight="40.0" prefWidth="300.0" styleClass="btns">
            <padding>
                <Insets left="10.0" />
            </padding>
            <cursor>
                <Cursor fx:constant="HAND" />
            </cursor>
            <Label text="Organizations" textFill="#7c8184">
                <font>
                    <Font name="Calibri Light" size="15.0" />
                </font>
                <HBox.margin>
                    <Insets left="10.0" />
                </HBox.margin>
            </Label>
        </HBox>
        <HBox id="templates" alignment="CENTER_LEFT" layoutX="10.0" layoutY="252.0" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" onMouseClicked="#handleViewChanged" prefHeight="40.0" prefWidth="300.0" styleClass="btns">
            <padding>
                <Insets left="10.0" />
            </padding>
            <cursor>
                <Cursor fx:constant="HAND" />
            </cursor>
            <Label text="Templates" textFill="#7c8184">
                <font>
                    <Font name="Calibri Light" size="15.0" />
                </font>
                <HBox.margin>
                    <Insets left="10.0" />
                </HBox.margin>
            </Label>
        </HBox>
        <VBox prefHeight="10" prefWidth="300.0" styleClass="box" VBox.vgrow="ALWAYS">
            <VBox.margin>
                <Insets />
            </VBox.margin>
            <padding>
                <Insets left="10.0" top="10.0" />
            </padding>
        </VBox>
      <BorderPane fx:id="controlPane" prefHeight="150.0" prefWidth="300.0" styleClass="box" />

    </VBox>
    <VBox layoutX="300.0" prefHeight="600.0" prefWidth="724.0">
        <Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="75.0" prefWidth="724.0" style="-fx-background-color: #DCDCDC;">
            <effect>
                <DropShadow blurType="ONE_PASS_BOX" color="#e8e4e4" height="10.0" radius="4.5" width="10.0" />
            </effect>
            <Label fx:id="titleText" layoutX="14.0" layoutY="24.0" text="Welcome" textFill="#7c8184">
                <font>
                    <Font size="18.0" />
                </font>
            </Label>
        </Pane>

        <HBox alignment="CENTER" />
        <BorderPane fx:id="appFrame" prefHeight="536.0" prefWidth="724.0">
            <center>
                <fx:include source="welcome.fxml" />
            </center>
        </BorderPane>
    </VBox>
</AnchorPane>

MenuController-它将拥有用户对象并将其加载到UpdateUserController

public class MenuController implements Initializable {

    @FXML
    private AnchorPane anchorPane;

    @FXML
    private JFXButton updateUser;

    private User user = new User("Joe","Rogan","username","password");


    @Override
    public void initialize(URL location, ResourceBundle resources) {

        updateUser.setOnAction((ActionEvent event) -> {
            initializeUpdateController("Path of the fxml file", user , "title");
        });
    }
}
public class UpdateUserController implements Initializable {

    @FXML
    private AnchorPane anchorPane;

    @FXML
    private TextField userNameField;

    @FXML
    private PasswordField passwordField;

    @FXML
    private JFXButton submit;

    private DatabaseHelper helper = new DatabaseHelper();


    @Override
    public void initialize(URL location, ResourceBundle resources) {

        submit.setOnAction((ActionEvent event) -> {
            String userName = userNameField.getText();
            String password = passwordField.getText();
            String salt = helper.randomSaltString();
            password = salt + password + salt;
            password = sha256(password);

            helper.updateUserInDatabase(username,password);

        });
    }

    public void fillTextFields(User user) {
        userNameField.setText(user.getUsername());
        passwordField.setText(user.getPassword());
    }
}
UpdateUserController

public class MenuController implements Initializable {

    @FXML
    private AnchorPane anchorPane;

    @FXML
    private JFXButton updateUser;

    private User user = new User("Joe","Rogan","username","password");


    @Override
    public void initialize(URL location, ResourceBundle resources) {

        updateUser.setOnAction((ActionEvent event) -> {
            initializeUpdateController("Path of the fxml file", user , "title");
        });
    }
}
public class UpdateUserController implements Initializable {

    @FXML
    private AnchorPane anchorPane;

    @FXML
    private TextField userNameField;

    @FXML
    private PasswordField passwordField;

    @FXML
    private JFXButton submit;

    private DatabaseHelper helper = new DatabaseHelper();


    @Override
    public void initialize(URL location, ResourceBundle resources) {

        submit.setOnAction((ActionEvent event) -> {
            String userName = userNameField.getText();
            String password = passwordField.getText();
            String salt = helper.randomSaltString();
            password = salt + password + salt;
            password = sha256(password);

            helper.updateUserInDatabase(username,password);

        });
    }

    public void fillTextFields(User user) {
        userNameField.setText(user.getUsername());
        passwordField.setText(user.getPassword());
    }
}
此方法将使用要传递的字段初始化UpdateUserController

public void initializeUpdateController(String path, User user, String title) {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(getClass().getResource(path));
        try {
            loader.load();
            UpdateUserController controller = loader.getController();
            controller.fillTextFields(user);
        } catch (IOException e) {
            System.out.println("Error init Update Controller " + e.getMessage());
        }
        loadAndShowStage(loader, title);
    }

 public static void loadAndShowStage(FXMLLoader loader, String title) {
        Parent parent = loader.getRoot();
        Stage stage = new Stage();
        stage.setScene(new Scene(parent));
        stage.setTitle(title);
        stage.show();
    }
有关更多帮助,请查看此链接。 1. 2.