Загрузите новый F XML в указанном узле c и установите сохраненные данные в JavaFX - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть приложение JavaFX, которое создает начальный этап и сцену, разделенную на 3 части (горизонтальное меню: черный, VBox с основным содержимым: красный, Vbox с нижним колонтитулом: синий). Через соответствующие кнопки пользователь может проходить различные сцены, загруженные в основной контент VBox. Данные каждого элемента управления в каждом fmxl хранятся в данных объекта типа «Данные». Вопрос заключается в том, как я могу установить специфические c данные, хранящиеся в объекте данных, в элементы управления каждого f xml, когда пользователь переходит ко второй и третьей сцене (назад и вперед). Другими словами, если пользователь запрашивает вторую сцену, в элементе управления tf3 (который является TextField) должно быть записано значение data.tf3, которое было сохранено в объекте данных.

Заранее спасибо! Main Scene Second Scene Third Scene

Основной. java

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
    public static Data data = new Data();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));
        Scene scene = new Scene(root, 640, 480);
        primaryStage.setTitle("Demo");
        primaryStage.setScene(scene);
        primaryStage.sizeToScene();
        primaryStage.show();
    }
}

Данные. java

public class Data {
    public String textField1;
    public String textField2;
    public String textField3;
    public String textField4;
    public int checkBox;
}

MainController. java

import java.io.IOException;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;

public class MainController {

    @FXML private TextField tf1;
    @FXML private TextField tf2;
    @FXML private CheckBox cb;
    @FXML private Button btToSecondScene;
    @FXML private VBox mainPane;

    @FXML
    void initialize() {

    }

    public void onButtonToSecondSceneClicked(ActionEvent event) throws IOException
    {
        getData();
        VBox pane = FXMLLoader.load(getClass().getResource("SecondScene.fxml"));
        mainPane.getChildren().setAll(pane);
    }

    public void getData() {
        Main.data.textField1 = tf1.getText();
        Main.data.textField2 = tf2.getText();
        Main.data.checkBox = cb.isSelected() ? 1 : 0;
    }

    public void setData() {
        tf1.setText(Main.data.textField1);
        tf2.setText(Main.data.textField2);
        cb.isSelected();
    }
}

SecondController. java

    import java.io.IOException;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;

public class SecondController {

    @FXML private TextField tf3;
    @FXML private Button btToThirdScene;
    @FXML private VBox mainPane;

    public void onButtonToThirdSceneClicked(ActionEvent event) throws IOException
    {
        VBox pane = FXMLLoader.load(getClass().getResource("ThirdScene.fxml"));
        mainPane.getChildren().setAll(pane);
    }
}

ThirdController. java

    import java.io.IOException;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;

public class ThirdController {

    @FXML private TextField tf4;
    @FXML private Button btToSecond;
    @FXML private VBox mainPane;

    public void onButtonToSecondClicked(ActionEvent event) throws IOException
    {
        VBox pane = FXMLLoader.load(getClass().getResource("SecondScene.fxml"));
        mainPane.getChildren().setAll(pane);
    }
}

Main.f xml

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.paint.Color?>
<?import javafx.scene.text.Font?>

<AnchorPane prefHeight="480.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="MainController">
   <children>
      <VBox prefHeight="480.0" prefWidth="640.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
         <children>
            <MenuBar prefHeight="27.0" prefWidth="1281.0">
              <menus>
                <Menu mnemonicParsing="false" text="File">
                  <items>
                    <MenuItem mnemonicParsing="false" text="Close" />
                  </items>
                </Menu>
              </menus>
            </MenuBar>
            <VBox fx:id="mainPane" prefHeight="761.0" prefWidth="1280.0" VBox.vgrow="ALWAYS">
               <children>
                  <AnchorPane prefHeight="412.0" prefWidth="1280.0" VBox.vgrow="ALWAYS">
                     <children>
                        <VBox prefHeight="200.0" prefWidth="100.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="15.0" AnchorPane.rightAnchor="15.0" AnchorPane.topAnchor="15.0">
                           <children>
                              <Label prefHeight="17.0" text="Text Field 1">
                                 <VBox.margin>
                                    <Insets left="10.0" top="10.0" />
                                 </VBox.margin>
                                 <graphic>
                                    <TextField fx:id="tf1" />
                                 </graphic>
                              </Label>
                              <Label layoutX="20.0" layoutY="20.0" prefHeight="17.0" text="Text Field 2">
                                 <graphic>
                                    <TextField fx:id="tf2" />
                                 </graphic>
                                 <VBox.margin>
                                    <Insets left="10.0" top="10.0" />
                                 </VBox.margin>
                              </Label>
                              <CheckBox fx:id="cb" mnemonicParsing="false" text="CheckBox">
                                 <VBox.margin>
                                    <Insets left="10.0" right="10.0" top="10.0" />
                                 </VBox.margin>
                              </CheckBox>
                           </children>
                        </VBox>
                     </children>
                  </AnchorPane>
                  <AnchorPane prefHeight="164.0" prefWidth="1280.0" VBox.vgrow="ALWAYS">
                     <children>
                        <Button fx:id="btToSecondScene" layoutX="947.0" layoutY="75.0" mnemonicParsing="false" onAction="#onButtonToSecondSceneClicked" prefHeight="50.0" prefWidth="200.0" text="To Second Scene -&gt;" AnchorPane.bottomAnchor="15.0" AnchorPane.rightAnchor="15.0">
                           <font>
                              <Font size="14.0" />
                           </font>
                        </Button>
                     </children>
                  </AnchorPane>
                  <AnchorPane prefHeight="154.0" prefWidth="1280.0" VBox.vgrow="ALWAYS" />
               </children>
            </VBox>
            <HBox id="HBox" alignment="CENTER_LEFT" prefHeight="1.0" prefWidth="1380.0" spacing="5.0">
               <children>
                  <Label maxWidth="-1.0" prefWidth="98.0" text="Main Program" HBox.hgrow="ALWAYS">
                     <font>
                        <Font name="System Bold" size="11.0" />
                     </font>
                     <textFill>
                        <Color blue="0.625" green="0.625" red="0.625" />
                     </textFill>
                  </Label>
                  <Pane prefHeight="0.0" prefWidth="1156.0" HBox.hgrow="ALWAYS" />
               </children>
               <padding>
                  <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
               </padding>
            </HBox>
         </children>
      </VBox>
   </children>
</AnchorPane>

SecondScene.f xml

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>

<VBox fx:id="mainPane" minHeight="-Infinity" minWidth="-Infinity" prefHeight="480.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="SecondController">
   <children>
      <AnchorPane>
         <children>
            <VBox prefHeight="230.0" prefWidth="100.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="15.0" />
            <Label layoutX="10.0" layoutY="10.0" prefHeight="17.0" text="Text Field 3">
               <graphic>
                  <TextField fx:id="tf3" />
               </graphic>
            </Label>
         </children>
      </AnchorPane>
      <AnchorPane prefHeight="154.0" prefWidth="1280.0">
         <children>
            <Button fx:id="btToThirdScene" mnemonicParsing="false" onAction="#onButtonToThirdSceneClicked" prefHeight="50.0" prefWidth="200.0" text="To Third Scene ---&gt;" AnchorPane.bottomAnchor="15.0" AnchorPane.rightAnchor="15.0" />
         </children>
      </AnchorPane>
   </children>
</VBox>

ThirdScene.fmxl

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.VBox?>

<VBox fx:id="mainPane" minHeight="-Infinity" minWidth="-Infinity" prefHeight="480.0" prefWidth="640.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="ThirdController">
    <children>
        <AnchorPane>
            <children>
                <VBox prefHeight="230.0" prefWidth="100.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="15.0" />
                <Label layoutX="10.0" layoutY="10.0" prefHeight="17.0" text="Text Field 4">
                    <graphic>
                        <TextField fx:id="tf4" />
                    </graphic>
                </Label>
            </children>
        </AnchorPane>
        <AnchorPane prefHeight="154.0" prefWidth="1280.0">
            <children>
                <Button fx:id="btToMainScene" mnemonicParsing="false" onAction="#onButtonToSecondClicked" prefHeight="50.0" prefWidth="200.0" text="&lt;--- To Second Scene" AnchorPane.bottomAnchor="15.0" AnchorPane.rightAnchor="15.0" />
            </children>
        </AnchorPane>
    </children>
</VBox>
...