JAVAFX: переключение между панелями в BorderPane - PullRequest
1 голос
/ 03 апреля 2020

У меня есть настольное приложение, которое содержит:

Основной класс: загрузка первого файла f xml -> SideBar.f xml

SideBar.f xml: содержит BorderPane -> слева от него, я создаю 2 кнопки:

         - the fist button: load  sample fxml file
         - the second button: load secondFxml file

sample.f xml: содержит tableView и Button secondF xml .f xml: содержит метку

Контроллер: класс, который управляет sample.f xml -> загрузка случайных двойных значений в tableView

проблема:

когда я нажимаю кнопку (заполнить таблицу) на панели 1: она загружает данные в tableView, пока все не идет хорошо

, когда я переключаюсь на вторую панель и возвращаюсь на первую панель центральной панели границы перезагружается снова, поэтому данные tableView исчезли

. Что я хочу, так это то, что когда я возвращаюсь на первую панель, представление таблицы остается прежним, когда я пытаюсь скрыть центр границы, но это не работает для Я

i screenShot проблема: Gif

Main:

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("SideBar.fxml"));
        primaryStage.setTitle("Hello World");
        primaryStage.setScene(new Scene(root, 700, 500));
        primaryStage.show();
    }

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

SideBarController:

public class SideBarController implements Initializable {

    @FXML BorderPane borderPane;

    public void openPane1(ActionEvent event) throws Exception {
        loadScene("Sample.fxml");
    }

    public void openPane2(ActionEvent event) throws Exception {
        loadScene("secondFxml.fxml");
    }

    private void loadScene(String sc) throws IOException {
        Parent root = FXMLLoader.load(getClass().getResource(sc));

        borderPane.setCenter(root);
    }

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

Контроллер:

public class Controller implements Initializable {

    double[][] data = new double[5][5];
    Random random = new Random();

    ObservableList<double[]> observableLists = FXCollections.observableArrayList();

    @FXML
    TableView<double []> tableView = new TableView<>(observableLists);

    @FXML
    public void fillTable(ActionEvent event) throws IOException {
        //Random Values
        for (int i = 0; i <data.length ; i++) {
            for (int j = 0; j <data[0].length ; j++) {
                data[i][j]= random.nextDouble();
            }
        }

        //Add data to ObservableLists
        for (int i = 0; i <data.length ; i++) {
            observableLists.add(data[i]);
        }

        //Create Columns
        for (int i = 0; i <data[0].length ; i++) {
            TableColumn<double[], Double> column= null;
            column = new TableColumn<>("column "+i);
            int finalI = i;
            column.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(param.getValue()[finalI]));
            tableView.getColumns().add(column);
        }

        // Fill TableView
        tableView.setItems(observableLists);

    }

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

    }
}

SideBar.f xml


<BorderPane fx:id="borderPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.SideBarController">
   <left>
      <VBox prefHeight="400.0" prefWidth="173.0" style="-fx-background-color: black;" BorderPane.alignment="CENTER">
         <children>
            <Button mnemonicParsing="false" onAction="#openPane1" prefHeight="25.0" prefWidth="177.0" style="-fx-background-color: blue; -fx-border-color: white;" text="Pane 1" textFill="WHITE">
               <VBox.margin>
                  <Insets top="50.0" />
               </VBox.margin>
               <font>
                  <Font name="System Bold" size="17.0" />
               </font>
            </Button>
            <Button mnemonicParsing="false" onAction="#openPane2" prefHeight="25.0" prefWidth="176.0" style="-fx-background-color: blue; -fx-border-color: white;" text="Pane 2" textFill="WHITE">
               <VBox.margin>
                  <Insets top="10.0" />
               </VBox.margin>
               <font>
                  <Font name="System Bold" size="17.0" />
               </font>
            </Button>
         </children>
      </VBox>
   </left>
   <center>
      <Pane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
         <children>
            <Label layoutX="163.0" layoutY="152.0" prefHeight="68.0" prefWidth="131.0" text="Home">
               <font>
                  <Font size="46.0" />
               </font>
            </Label>
         </children>
      </Pane>
   </center>
</BorderPane>

Sample.f xml


<Pane prefHeight="395.0" prefWidth="597.0" style="-fx-background-color: white;" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
   <children>
      <TableView fx:id="tableView" layoutX="77.0" layoutY="47.0" prefHeight="266.0" prefWidth="461.0" />
      <Button layoutX="257.0" layoutY="329.0" mnemonicParsing="false" onAction="#fillTable" text="fill Table" />
   </children>
</Pane>

SecondF xml .f xml


<Pane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label layoutX="232.0" layoutY="153.0" text="Pane 2">
         <font>
            <Font size="46.0" />
         </font>
      </Label>
   </children>
</Pane>

1 Ответ

1 голос
/ 04 апреля 2020

Не перезагружать с f xml при нажатии кнопки. Сделайте это один раз за initialize:

public class SideBarController implements Initializable {

    @FXML BorderPane borderPane;
    private Parent sample, secondFxml;

    public void openPane1(ActionEvent event) throws Exception {
        borderPane.setCenter(sample);
    }

    public void openPane2(ActionEvent event) throws Exception {
        borderPane.setCenter(secondFxml);
    }

    private Parent loadScene(String sc) throws IOException {
        return FXMLLoader.load(getClass().getResource(sc));
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        try {
            sample = loadScene("Sample.fxml");
            secondFxml =  loadScene("secondFxml.fxml");
        } catch (IOException ex) {
            ex.printStackTrace();
        };
    }
}
...