简体   繁体   English

JavaFX 同时使用多个控制器

[英]JavaFX Multiple Controllers at the Same Time

I'm working on a JavaFX application and have run into the following problem while making the kind of "dashboard" of my app.我正在开发一个 JavaFX 应用程序,并在制作我的应用程序的那种“仪表板”时遇到了以下问题。 The structure of the application is as follows:应用程序的结构如下:

This is the menu or "dashboard" which is kind of the main controller.这是菜单或“仪表板”,它是一种主控制器。 The issue I'm running into is being able to send commands from the 'control panel' to the main view.我遇到的问题是能够从“控制面板”向主视图发送命令。

the fx:ids of appFrame and controlPanel are where these views are being displayed. appFrame 和 controlPanel 的 fx:ids 是显示这些视图的地方。 How can I get these two panels (each with their own controller) to communicate?我怎样才能让这两个面板(每个面板都有自己的控制器)进行通信?

<?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 - which will have the user object and load it in the UpdateUserController 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");
        });
    }
}

UpdateUserController更新用户控制器

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());
    }
}

This method will initialize the UpdateUserController with the fields that you want to pass.此方法将使用您要传递的字段初始化 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();
    }

For more help, check this link out.如需更多帮助,请查看此链接。 1. Passing Parameters JavaFX FXML 2. Load FXML into a Pane(HBOX or VBOX) 1. 传递参数 JavaFX FXML 2. 将FXML 加载到窗格中(HBOX 或 VBOX)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM