JavaFX - переключение видов при сохранении панели инструментов - PullRequest
0 голосов
/ 22 февраля 2020

Я хочу создать приложение с несколькими различными видами (поэтому я могу изменить корни), но с той же панелью инструментов (которая после нажатия определенных кнопок изменяет root). До сих пор я пробовал жестко запрограммировать панель инструментов в файлах fxtml, а также создавать ее в своем основном приложении (но проблема в том, что мне нужно менять сцены, которые больше не содержат панель инструментов). Прямо сейчас мой код выглядит так:

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ToolBar;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
        Parent bikeScene = FXMLLoader.load(getClass().getResource("bikes.fxml"));

        Button bikes = new Button("Bikes");
        bikes.getStylesheets().add("tool-bar");
        bikes.setOnAction(e->primaryStage.setScene(new Scene(bikeScene, 900, 1900)));
        ToolBar tb = new ToolBar();
        tb.getItems().add(bikes);
        primaryStage.setTitle("management app");
        VBox vb = new VBox(tb);
        Scene sc = new Scene(vb, 900, 1900);
        sc.getStylesheets().add("sample/style.css");
        primaryStage.setScene(sc);

        primaryStage.setMaximized(true);
        primaryStage.show();
    }


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

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

edit:

Поэтому я решил использовать mainView как root, и теперь у меня есть:

public class Main extends Application {

    public void start(Stage primaryStage) throws Exception{

        Button bikes = new Button("Bikes");
        bikes.getStyleClass().add("tool-bar");
        Button rooms = new Button("Rooms");
        rooms.getStyleClass().add("tool-bar");
        Button food = new Button("Food");
        food.getStyleClass().add("tool-bar");
        Button cars = new Button("Cars");
        cars.getStyleClass().add("tool-bar");
        Button admin = new Button("Admin");
        admin.getStyleClass().add("tool-bar");

        BorderPane mainView = new BorderPane();
        BorderPane ToolBorderPane = new BorderPane();
        ToolBar tBarLeft=new ToolBar();
        ToolBar tBarRight=new ToolBar();

        tBarLeft.getItems().addAll(rooms, bikes, food, cars);
        tBarRight.getItems().add(admin);
        ToolBorderPane.setLeft(tBarLeft);
        ToolBorderPane.setRight(tBarRight);
        ToolBorderPane.getStyleClass().add("tool-bar");
        mainView.setTop(ToolBorderPane);

        bikes.setOnAction(e-> {
            try {
                mainView.getChildren().add(loader("bikes.fxml"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });


        rooms.setOnAction(e-> {
            try {
                mainView.getChildren().add(loader("rooms.fxml"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });

        food.setOnAction(e-> {
            try {
                mainView.getChildren().add(loader("food.fxml"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });

        cars.setOnAction(e-> {
            try {
                mainView.getChildren().add(loader("cars.fxml"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });



        admin.setOnAction(e->
        {
            try {
                mainView.getChildren().add(loader("admin.fxml"));
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        });

        GridPane loader =  loader("sample.fxml");
        mainView.getChildren().add(loader);
        primaryStage.setTitle("management app");
        Scene sc = new Scene(mainView, 1900, 1900);
        sc.getStylesheets().add("sample/style.css");

        primaryStage.setScene(sc);
        primaryStage.setMaximized(true);
        primaryStage.show();
    }
    public GridPane loader(String string) throws IOException {
        GridPane loader =  FXMLLoader.load(getClass().getResource(string));
        return loader;
    }

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

Теоретически это работает, но после нажатия на определенные кнопки Я получаю действительно странно отформатированный контент. Например, мой файл rooms.f xml выглядит следующим образом:

          xmlns:fx="http://javafx.com/fxml" alignment="center" hgap="10" vgap="10">
    <Label alignment="BOTTOM_RIGHT" text="let's see if it works" />
</GridPane>

В то время как текст отображается в левом верхнем углу вместо нижнего правого.

...