Как предотвратить перезагрузку сцены внутри рамки?

Я пишу свое первое приложение JavaFX и использую класс запуска (Launcher.java) для запуска основной сцены (Main.java), которая использует MainMenuController.java с рамкой. При инициализации я загружаю другой контроллер в центре границы, где выполняются фактические операции.

Пусковая установка:

public class Launcher {
    static final String CONFIGPATH = System.getProperty("user.dir") + "\\config.properties";

    public static void main(String[] args) {
        Application.launch(Main.class, args);
    }

}

Основной:

public class Main extends Application {
    Parent root;
    Stage stage;

    @Override
    public void start(Stage primaryStage) {
        try {
            root = FXMLLoader.load(Objects.requireNonNull(getClass().getResource("main-menu.fxml")));
            stage = primaryStage;
            stage.setTitle("Helvetia OpenShift Helper");
            stage.setHeight(850);
            stage.setWidth(1100);

            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


}

ГлавныйМенюКонтроллер:

public class MainMenuController {

    @FXML
    BorderPane mainPane;

    public MainMenuController() {
    }

    //Load DiffChecker on GUI init
    @FXML
    private void initialize() throws IOException {

        DiffCheckerController diffCheckerController = new DiffCheckerController();
        mainPane.setCenter(diffCheckerController);
    }

    //Load specific apps on click
    public void onBtnAClick(ActionEvent actionEvent) throws IOException {
            DiffCheckerController diffCheckerController = new DiffCheckerController();
            mainPane.setCenter(diffCheckerController);
    }
}

Итак, по сути, поскольку DiffCheckerController загружается при инициализации в центр границы, как я могу предотвратить его перезагрузку/сброс с помощью метода onBtnAClick? В будущем внутри этого приложения появятся и другие «приложения», поэтому оно уже реализовано таким образом.

Я пытался

public void onBtnAClick(ActionEvent actionEvent) throws IOException {
    if (mainPane.getCenter() != DiffCheckerController) {
        DiffCheckerController diffCheckerController = new DiffCheckerController();
        mainPane.setCenter(diffCheckerController);
    } 
            
}

Но это не сработало.

Не совсем понятно, о чем вы спрашиваете. Ваш обработчик кнопок явно создает новый экземпляр того, что вы вызвали DiffCheckerController (который выглядит как представление, а не контроллер), и устанавливает его в качестве центра mainPane. Если вы не хотите, чтобы это происходило, когда пользователь нажимает кнопку, просто не помещайте сюда этот код.

James_D 12.08.2024 15:01

Привет @James_D! В конечном продукте слева будет меню для перехода к различным функциям, которое появится в центре mainPane. По сути, да, обработчик кнопки должен создавать новый экземпляр DiffCheckerController при нажатии, но только если экземпляр DiffCheckerControler еще не установлен в качестве центра mainPane. Надеюсь, это проясняет мой вопрос.

Kwigo 14.08.2024 07:07

Зачем вам новый экземпляр? Почему бы не использовать существующий экземпляр, если он уже загружен?

James_D 14.08.2024 12:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

public class MainMenuController {

    @FXML
    BorderPane mainPane;

    private DiffCheckerController diffCheckerController ;

    public MainMenuController() {
    }

    //Load DiffChecker on GUI init
    @FXML
    private void initialize() throws IOException {

        diffCheckerController = new DiffCheckerController();
        mainPane.setCenter(diffCheckerController);
    }

    //Load specific apps on click
    public void onBtnAClick() {
        mainPane.setCenter(diffCheckerController);
    }
}

Ах да, мне просто не следует повторять это представление во второй раз... Так очевидно. Спасибо!

Kwigo 15.08.2024 13:22

Другие вопросы по теме