/
victor_t
/
maze
Обзор
Документация
Войти
/
victor_t
/
maze
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
1
CI/CD
Аналитика
Безопасность
master
src/view/MainWindow.java
197 строк
6 KB
Victor
relocated project folder
03 июл 2026, 03:14
03 июл 2026, 03:14
827638e
Код
Авторство
О чём код?
package view; import controller.Controller; import java.io.File; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.Spinner; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.stage.FileChooser; import javafx.stage.Stage; /** * Главное окно приложения для работы с лабиринтом. * * <p>{@code MainWindow} предоставляет пользовательский интерфейс * для генерации, загрузки, сохранения и отображения лабиринта.</p> * * <p>Взаимодействует с моделью через {@link controller.Controller} * и использует {@link MazeCanvas} для визуализации.</p> * * <p>Также позволяет открыть отдельное окно для работы с пещерой * ({@link CaveWindow}).</p> */ public class MainWindow { private final Controller controller; private final MazeCanvas mazeCanvas; private final Spinner<Integer> rowSpinner; private final Spinner<Integer> colSpinner; private CaveWindow caveWindow; private final Stage stage; /** * Создает главное окно приложения. * * @param stage основная сцена JavaFX * @param controller контроллер приложения */ public MainWindow(Stage stage, Controller controller) { this.stage = stage; this.controller = controller; stage.setTitle("A1 Maze"); mazeCanvas = new MazeCanvas(); mazeCanvas.setController(controller); rowSpinner = new Spinner<>(); colSpinner = new Spinner<>(); SpinnerUtils.setupIntegerSpinner(rowSpinner, 1, 50, 10, 1); SpinnerUtils.setupIntegerSpinner(colSpinner, 1, 50, 10, 1); Button generateBtn = new Button("Generate"); generateBtn.setOnAction(e -> onGenerate()); Button loadBtn = new Button("Load"); loadBtn.setOnAction(e -> onLoad()); Button saveBtn = new Button("Save"); saveBtn.setOnAction(e -> onSave()); Button openCaveBtn = new Button("Open Cave"); openCaveBtn.setOnAction(e -> onOpenCave()); HBox controls = new HBox(8, new Label("Rows:"), rowSpinner, new Label("Cols:"), colSpinner, generateBtn, loadBtn, saveBtn, openCaveBtn ); controls.setPadding(new Insets(8)); BorderPane root = new BorderPane(); root.setCenter(mazeCanvas); root.setBottom(controls); Scene scene = new Scene(root); stage.setScene(scene); stage.setResizable(false); stage.centerOnScreen(); } /** * Отображает главное окно. */ public void show() { stage.show(); } /** * Генерирует новый лабиринт с параметрами из интерфейса. * * <p>Сбрасывает выбор точек и обновляет отображение.</p> */ private void onGenerate() { int row = rowSpinner.getValue(); int col = colSpinner.getValue(); controller.generate(row, col); mazeCanvas.setCounter(0); mazeCanvas.draw(); } /** * Загружает лабиринт из файла. * * <p>При успешной загрузке обновляет размеры и отображение.</p> */ private void onLoad() { FileChooser fc = new FileChooser(); fc.setTitle("Open file with Maze"); fc.setInitialDirectory(new File(".")); File file = fc.showOpenDialog(stage); if (file == null) { showInfo("Please select a file", "Error 404"); return; } try { controller.loadFromFile(file.getAbsolutePath()); mazeCanvas.draw(); rowSpinner.getValueFactory().setValue(controller.getRow()); colSpinner.getValueFactory().setValue(controller.getCol()); } catch (Exception ex) { showError("This file is not suitable for the maze", "Error"); onGenerate(); } } /** * Сохраняет текущий лабиринт в файл. */ private void onSave() { FileChooser fc = new FileChooser(); fc.setTitle("Save Maze"); fc.setInitialDirectory(new File(".")); File file = fc.showSaveDialog(stage); if (file != null) { try { controller.saveToFile(file.getAbsolutePath()); } catch (Exception ex) { showError("Unable to save file", "Error"); } } } /** * Открывает окно симуляции пещеры. * * <p>Создает окно один раз и переиспользует его.</p> */ private void onOpenCave() { if (caveWindow == null) { caveWindow = new CaveWindow(controller); } caveWindow.show(); } /** * Отображает информационное сообщение. * * @param text текст сообщения * @param title заголовок окна */ private void showInfo(String text, String title) { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle(title); alert.setContentText(text); alert.showAndWait(); } /** * Отображает сообщение об ошибке. * * @param text текст ошибки * @param title заголовок окна */ private void showError(String text, String title) { Alert alert = new Alert(Alert.AlertType.ERROR); alert.setTitle(title); alert.setContentText(text); alert.showAndWait(); } }