Я пишу свое первое приложение 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);
}
}
Но это не сработало.
Привет @James_D! В конечном продукте слева будет меню для перехода к различным функциям, которое появится в центре mainPane. По сути, да, обработчик кнопки должен создавать новый экземпляр DiffCheckerController при нажатии, но только если экземпляр DiffCheckerControler еще не установлен в качестве центра mainPane. Надеюсь, это проясняет мой вопрос.
Зачем вам новый экземпляр? Почему бы не использовать существующий экземпляр, если он уже загружен?
Я не уверен, что действительно понимаю этот вопрос, но нет необходимости загружать представление более одного раза. Просто выполните рефакторинг очевидным способом:
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);
}
}
Ах да, мне просто не следует повторять это представление во второй раз... Так очевидно. Спасибо!
Не совсем понятно, о чем вы спрашиваете. Ваш обработчик кнопок явно создает новый экземпляр того, что вы вызвали
DiffCheckerController
(который выглядит как представление, а не контроллер), и устанавливает его в качестве центраmainPane
. Если вы не хотите, чтобы это происходило, когда пользователь нажимает кнопку, просто не помещайте сюда этот код.