From 2df2b62be96676c6bf10521a48338e588d490fc7 Mon Sep 17 00:00:00 2001 From: ZakenChannel Date: Sun, 5 May 2024 13:35:05 +0400 Subject: [PATCH] done lab 6 --- .../projectairfighter/FormConstructor.java | 42 ++-- .../projectairfighter/FormPlaneConfig.java | 37 ++-- .../FormWarPlaneCollection.java | 130 +++++++++-- .../collectiongenericobjects/Constructor.java | 6 +- .../MassiveGenericObjects.java | 39 +++- .../StorageCollection.java | 205 +++++++++++++----- .../drawnings/DrawningAirFighter.java | 10 +- .../drawnings/DrawningWarPlane.java | 63 +----- .../drawnings/EllipticalEngineDrawing.java | 5 + .../drawnings/EngineCount.java | 2 +- .../drawnings/IDrawableExtras.java | 1 + .../drawnings/RectangleEngineDrawing.java | 5 + .../drawnings/TriangleEngineDrawing.java | 5 + .../entities/EntityAirFighter.java | 39 +++- .../entities/EntityWarPlane.java | 44 +++- .../FormWarPlaneCollection.fxml | 179 ++++++++------- 16 files changed, 525 insertions(+), 287 deletions(-) diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/FormConstructor.java b/ProjectAirFighter/src/main/java/com/projectairfighter/FormConstructor.java index 105edc6..6e5ba31 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/FormConstructor.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/FormConstructor.java @@ -5,7 +5,6 @@ import com.projectairfighter.drawnings.*; import com.projectairfighter.entities.EntityAirFighter; import com.projectairfighter.entities.EntityWarPlane; import javafx.application.Application; -import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -34,7 +33,7 @@ public class FormConstructor extends Application { private Constructor constructor; @FXML - private void generatePlane(ActionEvent event) { + private void generatePlane() { if (constructor == null) { constructor = createAirFighterDrawable(); } @@ -55,7 +54,7 @@ public class FormConstructor extends Application { } @FXML - public void buttonGoToForm(ActionEvent event) { + public void buttonGoToForm() { FormWarPlaneCollection formWarPlaneCollection = FormWarPlaneCollection.getFormWarPlaneCollection(); if (drawningWarPlane != null && formWarPlaneCollection != null) { formWarPlaneCollection.createObject(drawningWarPlane); @@ -71,44 +70,45 @@ public class FormConstructor extends Application { canvas = (Canvas) loader.getNamespace().get("canvas"); Scene scene = new Scene(root, 900, 500); primaryStage.setTitle("Информация о самолете"); + primaryStage.setResizable(false); primaryStage.setScene(scene); primaryStage.show(); } private Constructor createAirFighterDrawable() { Constructor drawable = new Constructor<>(); + + for (int i = 0; i < 3; i++) { + EntityWarPlane plane = createRandomPlane(); + if (plane == null) return null; + drawable.addAirFighter(plane); + drawable.addDrawingEngines(plane.getEngineDrawing()); + } + + return drawable; + } + + private EntityWarPlane createRandomPlane() { + Random random = new Random(); + int randomPlane = random.nextInt(1, 3); IDrawableExtras[] engineDrawings = { new EllipticalEngineDrawing(), new TriangleEngineDrawing(), new RectangleEngineDrawing() }; - Random random = new Random(); - for (int i = 0; i < 3; i++) { - EntityWarPlane plane = createRandomPlane(); - if (plane == null) return null; - drawable.addAirFighter(plane); - IDrawableExtras engineDrawing = engineDrawings[random.nextInt(engineDrawings.length)]; - engineDrawing.setCountEngines(random.nextInt(7)); - drawable.addDrawingEngines(engineDrawing); - } - - return drawable; - } - - - private EntityWarPlane createRandomPlane() { - Random random = new Random(); - int randomPlane = random.nextInt(1, 3); + IDrawableExtras engineDrawing = engineDrawings[new Random().nextInt(engineDrawings.length)]; + engineDrawing.setCountEngines(random.nextInt(7)); return switch (randomPlane) { case 1 -> new EntityWarPlane(random.nextInt(200) + 100, random.nextInt(2000) + 1000, - getColor()); + getColor(), engineDrawing); case 2 -> new EntityAirFighter( random.nextInt(200) + 100, random.nextInt(2000) + 1000, getColor(), + engineDrawing, getColor(), random.nextBoolean(), random.nextBoolean()); diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/FormPlaneConfig.java b/ProjectAirFighter/src/main/java/com/projectairfighter/FormPlaneConfig.java index 10f7760..567fe6a 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/FormPlaneConfig.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/FormPlaneConfig.java @@ -17,6 +17,7 @@ import javafx.scene.paint.Color; import javafx.stage.Stage; import java.net.URL; +import java.util.Random; import java.util.ResourceBundle; public class FormPlaneConfig extends Application implements Initializable { @@ -53,25 +54,23 @@ public class FormPlaneConfig extends Application implements Initializable { }); countEngine.valueProperty().addListener((obs, oldVal, newVal) -> { - if (plane != null && plane.getEngineDrawing() != null) { + if (plane != null && plane.entityWarPlane.getEngineDrawing() != null) { canvas.getGraphicsContext2D().clearRect(0, 0, canvas.getWidth(), canvas.getHeight()); - plane.getEngineDrawing().setCountEngines(newVal); + plane.entityWarPlane.getEngineDrawing().setCountEngines(newVal); drawObject(); } }); checkBoxRockets.selectedProperty().addListener((obs, wasSelected, isSelected) -> { if (plane instanceof DrawningAirFighter) { - EntityAirFighter fighter = (EntityAirFighter) plane.entityWarPlane; - fighter.setBodyRockets(isSelected); + ((EntityAirFighter) plane.entityWarPlane).setBodyRockets(isSelected); drawObject(); } }); checkBoxWings.selectedProperty().addListener((obs, wasSelected, isSelected) -> { if (plane instanceof DrawningAirFighter) { - EntityAirFighter fighter = (EntityAirFighter) plane.entityWarPlane; - fighter.setAdditionalWings(isSelected); + ((EntityAirFighter) plane.entityWarPlane).setAdditionalWings(isSelected); drawObject(); } }); @@ -87,6 +86,7 @@ public class FormPlaneConfig extends Application implements Initializable { canvas = (Canvas) loader.getNamespace().get("canvas"); Scene scene = new Scene(root, 799, 251); stage.setTitle("Создание объекта"); + stage.setResizable(false); stage.setScene(scene); stage.show(); } @@ -194,35 +194,46 @@ public class FormPlaneConfig extends Application implements Initializable { if (db.hasString()) { String droppedText = db.getString(); + if (engine == null) { + IDrawableExtras[] engineDrawings = { + new EllipticalEngineDrawing(), + new TriangleEngineDrawing(), + new RectangleEngineDrawing() + }; + engine = engineDrawings[new Random().nextInt(engineDrawings.length)]; + engine.setCountEngines(countEngine.getValue()); + } + switch (droppedText) { case "Простой": - plane = new DrawningWarPlane(speed.getValue(), weight.getValue(), Color.WHITE); - plane.getEngineDrawing().setCountEngines(countEngine.getValue()); + plane = new DrawningWarPlane(speed.getValue(), weight.getValue(), Color.WHITE, engine); success = true; break; case "Продвинутый": - plane = new DrawningAirFighter(speed.getValue(), weight.getValue(), Color.WHITE, Color.BLACK, checkBoxRockets.isSelected(), checkBoxWings.isSelected()); - plane.getEngineDrawing().setCountEngines(countEngine.getValue()); + plane = new DrawningAirFighter(speed.getValue(), weight.getValue(), Color.WHITE, engine, Color.BLACK, checkBoxRockets.isSelected(), checkBoxWings.isSelected()); success = true; break; case "Прямоугольная": engine = new RectangleEngineDrawing(); engine.setCountEngines(countEngine.getValue()); - plane.setEngineDrawing(engine); + plane.entityWarPlane.setEngineDrawing(engine); + plane.entityWarPlane.setEngineDrawing(engine); engine.drawEngine(canvas.getGraphicsContext2D(), plane.entityWarPlane.getBodyColor(), 0, 0); success = true; break; case "Треугольная": engine = new TriangleEngineDrawing(); engine.setCountEngines(countEngine.getValue()); - plane.setEngineDrawing(engine); + plane.entityWarPlane.setEngineDrawing(engine); + plane.entityWarPlane.setEngineDrawing(engine); engine.drawEngine(canvas.getGraphicsContext2D(), plane.entityWarPlane.getBodyColor(), 0, 0); success = true; break; case "Овальная": engine = new EllipticalEngineDrawing(); engine.setCountEngines(countEngine.getValue()); - plane.setEngineDrawing(engine); + plane.entityWarPlane.setEngineDrawing(engine); + plane.entityWarPlane.setEngineDrawing(engine); engine.drawEngine(canvas.getGraphicsContext2D(), plane.entityWarPlane.getBodyColor(), 0, 0); success = true; break; diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/FormWarPlaneCollection.java b/ProjectAirFighter/src/main/java/com/projectairfighter/FormWarPlaneCollection.java index eea5f37..e731726 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/FormWarPlaneCollection.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/FormWarPlaneCollection.java @@ -3,16 +3,21 @@ package com.projectairfighter; import com.projectairfighter.collectiongenericobjects.*; import com.projectairfighter.drawnings.DrawningWarPlane; import javafx.application.Application; -import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; +import javafx.geometry.Insets; +import javafx.geometry.Pos; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.scene.canvas.Canvas; import javafx.scene.control.*; +import javafx.scene.layout.VBox; +import javafx.stage.FileChooser; +import javafx.stage.Modality; import javafx.stage.Stage; +import java.io.File; import java.io.IOException; import java.net.URL; import java.util.Random; @@ -68,7 +73,7 @@ public class FormWarPlaneCollection extends Application implements Initializable } @FXML - private void comboBoxSelectorCompany(ActionEvent event) { + private void comboBoxSelectorCompany() { splitPane.getItems().get(1).setDisable(true); } @@ -85,7 +90,7 @@ public class FormWarPlaneCollection extends Application implements Initializable } @FXML - private void buttonRemovePlaneClicked(ActionEvent event) { + private void buttonRemovePlaneClicked() { String text = textBox.getText(); if (text == null || text.isEmpty() || company == null) return; @@ -110,14 +115,14 @@ public class FormWarPlaneCollection extends Application implements Initializable } @FXML - private void buttonRefresh(ActionEvent event) { + private void buttonRefresh() { if (company == null) return; company.show(canvasWarPlane); } @FXML - private void buttonGoToCheck(ActionEvent event) { + private void buttonGoToCheck() { if (company == null) return; DrawningWarPlane warPlane = null; @@ -136,7 +141,7 @@ public class FormWarPlaneCollection extends Application implements Initializable } @FXML - private void buttonGoFormConstructor(ActionEvent event) { + private void buttonGoFormConstructor() { if (company == null) return; try { @@ -154,7 +159,7 @@ public class FormWarPlaneCollection extends Application implements Initializable } @FXML - private void buttonGoToFormWithDeleteObject(ActionEvent event){ + private void buttonGoToFormWithDeleteObject() { if (!removedPlanesStack.isEmpty()) { goToFormAirFighter(removedPlanesStack.get(new Random().nextInt(0, removedPlanesStack.size()))); } else { @@ -164,7 +169,7 @@ public class FormWarPlaneCollection extends Application implements Initializable } @FXML - private void buttonGoToFormCreate(ActionEvent event) { + private void buttonGoToFormCreate() { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("FormPlaneConfig.fxml")); Parent root = loader.load(); @@ -177,7 +182,7 @@ public class FormWarPlaneCollection extends Application implements Initializable } } - private void goToFormAirFighter(DrawningWarPlane plane){ + private void goToFormAirFighter(DrawningWarPlane plane) { try { FXMLLoader loader = new FXMLLoader(getClass().getResource("FormAirFighter.fxml")); Parent root = loader.load(); @@ -192,7 +197,7 @@ public class FormWarPlaneCollection extends Application implements Initializable } @FXML - void buttonCollectionAdd(ActionEvent event) { + void buttonCollectionAdd() { if (textFieldCollectionName.getText().isEmpty() || (!radioButtonList.isSelected() && !radioButtonMassive.isSelected())) { showError("Не все данные заполнены"); return; @@ -210,7 +215,7 @@ public class FormWarPlaneCollection extends Application implements Initializable } @FXML - void buttonCollectionDel(ActionEvent event) { + void buttonCollectionDel() { if (listViewCollection.getSelectionModel().getSelectedIndex() < 0 || listViewCollection.getSelectionModel().getSelectedItem() == null) { showError("Коллекция не выбрана"); return; @@ -228,9 +233,99 @@ public class FormWarPlaneCollection extends Application implements Initializable refreshListBoxItems(); } + /** + * Обработка нажатия "Сохранение" + */ + @FXML + private void saveToolStripMenuItem() { + Stage mainStage = (Stage) splitPane.getScene().getWindow(); + + Stage dialog = new Stage(); + dialog.setResizable(false); + dialog.initOwner(mainStage); + dialog.initModality(Modality.APPLICATION_MODAL); // Блокируем доступ к основному окну + dialog.setTitle("Выберите коллекцию для сохранения"); + + VBox layout = new VBox(10); + layout.setAlignment(Pos.CENTER); + + ToggleGroup toggleGroup = new ToggleGroup(); + + for (String collection : listViewCollection.getItems()) { + RadioButton radioButton = new RadioButton(collection); + radioButton.setPadding(new Insets(5)); + radioButton.setToggleGroup(toggleGroup); + layout.getChildren().add(radioButton); + } + + RadioButton allCollections = new RadioButton("Все коллекции"); + Button submitButton = new Button("Сохранить"); + allCollections.setToggleGroup(toggleGroup); + layout.getChildren().addAll(allCollections, submitButton); + + submitButton.setOnAction(e -> { + if (toggleGroup.getSelectedToggle() == null || storageCollection.keys().isEmpty()) { + showError("Не выбрана коллекция или выбранная коллекция пуста"); + return; + } + + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Сохранить данные"); + fileChooser.getExtensionFilters().addAll( + new FileChooser.ExtensionFilter("Text Files (*.txt)", "*.txt") + ); + + File selectedFile = fileChooser.showSaveDialog(null); + if (selectedFile != null) { + boolean success; + RadioButton selectedRadioButton = (RadioButton) toggleGroup.getSelectedToggle(); + if (selectedRadioButton.getText().equals("Все коллекции")) + success = storageCollection.saveData(selectedFile.getAbsolutePath()); + else + success = storageCollection.saveData(selectedFile.getAbsolutePath(), selectedRadioButton.getText()); + if (success) { + showAlert("Сохранение прошло успешно", "Результат", Alert.AlertType.INFORMATION); + } else { + showAlert("Не сохранилось", "Результат", Alert.AlertType.ERROR); + } + } + dialog.close(); // Закрыть диалог после сохранения + }); + + Scene scene = new Scene(layout, 250, 200); + dialog.setScene(scene); + dialog.showAndWait(); // Показываем диалог и ждем закрытия + } + + /** + * Обработка кнопки загрузки + */ + @FXML + private void loadToolStripMenuItem() { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Открыть текстовый файл"); + + // Настройка фильтра расширений для выбора только текстовых файлов + FileChooser.ExtensionFilter txtFilter = new FileChooser.ExtensionFilter("Text Files (*.txt)", "*.txt"); + fileChooser.getExtensionFilters().add(txtFilter); + + // Отображение диалога открытия файла + File selectedFile = fileChooser.showOpenDialog(null); + if (selectedFile != null) { + boolean success = storageCollection.loadData(selectedFile.getAbsolutePath()); + + if (success) { + refreshListBoxItems(); + showAlert("Загрузка прошла успешно", "Результат", Alert.AlertType.INFORMATION); + } else { + showAlert("Загрузка не выполнена", "Результат", Alert.AlertType.ERROR); + } + } + } + private void refreshListBoxItems() { listViewCollection.getItems().clear(); - for (String colName : storageCollection.Keys()) { + for (String colName : storageCollection.keys()) { if (colName != null && !colName.isEmpty()) { listViewCollection.getItems().add(colName); } @@ -238,7 +333,7 @@ public class FormWarPlaneCollection extends Application implements Initializable } @FXML - void buttonCreateCompany(ActionEvent event) { + void buttonCreateCompany() { if (listViewCollection.getSelectionModel().getSelectedIndex() < 0 || listViewCollection.getSelectionModel().getSelectedItem() == null) { showAlert("Коллекция не выбрана"); return; @@ -275,6 +370,14 @@ public class FormWarPlaneCollection extends Application implements Initializable alert.showAndWait(); } + private void showAlert(String message, String title, Alert.AlertType alertType) { + Alert alert = new Alert(alertType); + alert.setTitle(title); + alert.setHeaderText(null); + alert.setContentText(message); + alert.showAndWait(); + } + private void showError(String message) { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Ошибка"); @@ -295,6 +398,7 @@ public class FormWarPlaneCollection extends Application implements Initializable comboBox.getItems().addAll("Хранилище"); Scene scene = new Scene(root, 1292, 795); primaryStage.setTitle("Коллекция истребителей"); + primaryStage.setResizable(false); primaryStage.setScene(scene); primaryStage.show(); } diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/Constructor.java b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/Constructor.java index bc2139c..ecb3436 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/Constructor.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/Constructor.java @@ -30,14 +30,12 @@ public class Constructor { public DrawningWarPlane createDrawing() { Random rnd = new Random(); int entityIndex = rnd.nextInt(0, 3); - int engineCount = rnd.nextInt(0, 3); T selectedPlane = planes.get(entityIndex); - U selectedEngineCount = drawingEngines.get(engineCount); return (selectedPlane instanceof EntityAirFighter) ? - new DrawningAirFighter((EntityAirFighter) selectedPlane, selectedEngineCount) : - new DrawningWarPlane(selectedPlane, selectedEngineCount); + new DrawningAirFighter((EntityAirFighter) selectedPlane) : + new DrawningWarPlane(selectedPlane); } public String getPlaneInfo() { diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/MassiveGenericObjects.java b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/MassiveGenericObjects.java index 52c229e..c68966e 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/MassiveGenericObjects.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/MassiveGenericObjects.java @@ -1,6 +1,7 @@ package com.projectairfighter.collectiongenericobjects; -import java.util.Arrays; +import java.util.Iterator; +import java.util.NoSuchElementException; public class MassiveGenericObjects implements ICollectionGenericObjects { private T[] collection; @@ -11,7 +12,6 @@ public class MassiveGenericObjects implements ICollectionGenericObjects { } @Override - @SuppressWarnings("unchecked") public int getMaxCount() { return collection.length; } @@ -21,14 +21,9 @@ public class MassiveGenericObjects implements ICollectionGenericObjects { public void setMaxCount(int value){ if (value < 0) return; - // Создание нового массива с указанным размером T[] newCollection = (T[]) new Object[value]; - - // Копирование элементов из старого массива в новый - // Math.min используется, чтобы избежать ArrayIndexOutOfBoundsException System.arraycopy(collection, 0, newCollection, 0, Math.min(collection.length, value)); - // Присваивание нового массива переменной collection collection = newCollection; } @@ -45,6 +40,36 @@ public class MassiveGenericObjects implements ICollectionGenericObjects { return null; } + @Override + public CollectionType getCollectionType() { + return CollectionType.Massive; + } + + @Override + public Iterable getItems() { + return () -> new Iterator<>() { + private int currentIndex = 0; + + @Override + public boolean hasNext() { + return currentIndex < collection.length; + } + + @Override + public T next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + return collection[currentIndex++]; + } + + @Override + public void remove() { + throw new UnsupportedOperationException("Оператор не поддерживается"); + } + }; + } + @Override public int insert(T obj) { return insert(obj, 0); diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/StorageCollection.java b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/StorageCollection.java index edc9a2d..28c7512 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/StorageCollection.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/StorageCollection.java @@ -4,7 +4,9 @@ import com.projectairfighter.drawnings.DrawningWarPlane; import java.io.*; import java.util.*; -import java.util.regex.Pattern; + +import static com.projectairfighter.drawnings.ExtensionDrawningPlane.createDrawingPlane; +import static com.projectairfighter.drawnings.ExtensionDrawningPlane.getDataForSave; /** * Класс-хранилище коллекций. @@ -20,17 +22,32 @@ public class StorageCollection { /** * Ключевое слово, с которого должен начинаться файл */ - private final String collectionKey = "CollectionsStorage"; + private static final String COLLECTION_KEY = "CollectionsStorage"; /** - * Разделитель для записи ключа и значения элемента словаря + * Ключевое слово, с которого должен начинаться файл с определнной коллекцией */ - private final String separatorForKeyValue = "|"; + private static final String COLLECTION_KEY_ONE_COL = "OneCollectionsStorage"; /** - * Разделитель для записей коллекции данных в файл + * Разделитель для записи ключа и значения элемента словаря для всех коллекций */ - private final String separatorItems = ";"; + private static final String SEPARATOR_FOR_KEY_VALUE_ALL_COL = "&"; + + /** + * Разделитель для записи ключа и значения элемента словаря для определенной коллекции + */ + private static final String SEPARATOR_FOR_KEY_VALUE_ONE_TYPE_COL = "#"; + + /** + * Разделитель для записей коллекции данных в файл для всех коллекций + */ + private static final String SEPARATOR_ITEMS_ALL_COL = ";"; + + /** + * Разделитель для записей коллекции данных в файл для определенных коллекций + */ + private static final String SEPARATOR_ITEMS_ONE_TYPE_COL = "/"; /** @@ -38,12 +55,12 @@ public class StorageCollection { * * @return Список названий коллекций. */ - public List Keys() { + public List keys() { return new ArrayList<>(storages.keySet()); } /** - * Конструктор. + * Конструктор */ public StorageCollection() { storages = new HashMap<>(); @@ -67,7 +84,6 @@ public class StorageCollection { return; case List: storages.put(name, new ListGenericObjects<>()); - return; } } @@ -104,89 +120,173 @@ public class StorageCollection { * @return Элемент коллекции или null, если коллекция с данным названием отсутствует или индекс некорректен. */ public T getElement(String name, int index) { - return this.get(name).get(index); + return storages.get(name).get(index); } /** * Сохранение информации в файл + * @param path путь к файлу + * @return результат сохранения */ - public boolean saveData(String filename) { - // Проверяем, не пуста ли коллекция + public boolean saveData(String path) { if (storages.isEmpty()) { return false; } - // Удаляем файл, если он существует - File file = new File(filename); + File file = new File(path); if (file.exists()) { file.delete(); } try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { - // Записываем ключ коллекции - writer.write(collectionKey); + writer.write(COLLECTION_KEY); writer.newLine(); - // Итерируемся по коллекциям for (Map.Entry> entry : storages.entrySet()) { - // Пропускаем пустые коллекции if (entry.getValue().getCount() == 0) { continue; } StringBuilder sb = new StringBuilder(); sb.append(entry.getKey()); - sb.append(separatorForKeyValue); + sb.append(SEPARATOR_FOR_KEY_VALUE_ALL_COL); sb.append(entry.getValue().getCollectionType()); - sb.append(separatorForKeyValue); + sb.append(SEPARATOR_FOR_KEY_VALUE_ALL_COL); sb.append(entry.getValue().getMaxCount()); - sb.append(separatorForKeyValue); + sb.append(SEPARATOR_FOR_KEY_VALUE_ALL_COL); - // Сохраняем каждый элемент в коллекции for (T item : entry.getValue().getItems()) { - if (item == null) continue; // Проверка на null - String data = item.getDataForSave(); - if (data == null || data.isEmpty()) continue; + if (item == null) continue; + String data = getDataForSave(item); + + if (data.isEmpty()) continue; sb.append(data); - sb.append(separatorItems); + sb.append(SEPARATOR_ITEMS_ALL_COL); } writer.write(sb.toString()); writer.newLine(); } } catch (IOException e) { - e.printStackTrace(); return false; } return true; } + /** + * Сохранение в файл по имени коллекции + * @param path путь к файлу + * @param collection название коллекции для сохранения + * @return результат сохранения + */ + public boolean saveData(String path, String collection) { + if (storages.isEmpty()) { + return false; + } + + File file = new File(path); + if (file.exists()) { + file.delete(); + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write(COLLECTION_KEY_ONE_COL); + writer.newLine(); + + for (Map.Entry> entry : storages.entrySet()) { + if ((entry.getValue().getCount() == 0) || !entry.getKey().equals(collection)) { + continue; + } + + StringBuilder sb = new StringBuilder(); + sb.append(entry.getKey()); + sb.append(SEPARATOR_FOR_KEY_VALUE_ONE_TYPE_COL); + sb.append(entry.getValue().getCollectionType()); + sb.append(SEPARATOR_FOR_KEY_VALUE_ONE_TYPE_COL); + sb.append(entry.getValue().getMaxCount()); + sb.append(SEPARATOR_FOR_KEY_VALUE_ONE_TYPE_COL); + + for (T item : entry.getValue().getItems()) { + if (item == null) continue; + String data = getDataForSave(item); + + if (data.isEmpty()) continue; + sb.append(data); + sb.append(SEPARATOR_ITEMS_ONE_TYPE_COL); + } + + writer.write(sb.toString()); + writer.newLine(); + } + } catch (IOException e) { + return false; + } + return true; + } + + /** + * Обработка данных в файле + * @param recordLine строка данных для обработки + * @param keyValueSeparator разделитель ключа и значения + * @param itemSeparator разделитель свойств + * @return результат обработки + */ + @SuppressWarnings("unchecked") + private boolean processRecord(String recordLine, String keyValueSeparator, String itemSeparator) { + String[] record = recordLine.split(keyValueSeparator); + if (record.length != 4) { + return false; + } + + CollectionType collectionType = CollectionType.valueOf(record[1]); + ICollectionGenericObjects collection = StorageCollection.createCollection(collectionType); + if (collection == null) { + return false; + } + + collection.setMaxCount(Integer.parseInt(record[2])); + + String[] items = record[3].split(itemSeparator, -1); + for (String elem : items) { + T ship = (T) createDrawingPlane(elem); + if (ship != null && collection.insert(ship) == -1) { + return false; + } + } + storages.put(record[0], collection); + return true; + } + + /** * Загрузка информации из файла */ public boolean loadData(String filename) { - if (!new File(filename).exists()) return false; + File file = new File(filename); + if (!file.exists()) { + return false; + } - try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { - String str = reader.readLine(); - if (!collectionKey.equals(str)) return false; - storages.clear(); - while ((str = reader.readLine()) != null) { - String[] record = str.split(Pattern.quote(separatorForKeyValue)); - if (record.length != 4) continue; - CollectionType collectionType = CollectionType.valueOf(record[1]); - ICollectionGenericObjects collection = createCollection(collectionType); - if (collection == null) return false; - collection.setMaxCount(Integer.parseInt(record[2])); - String[] items = record[3].split(Pattern.quote(separatorItems)); - for (String item : items) { - T plane = item.createDrawingPlane(); // Нужна соответствующая реализация - if (plane != null && collection.insert(plane) == -1) return false; + try (BufferedReader br = new BufferedReader(new FileReader(file))) { + String str = br.readLine(); + if (str == null) { + return false; + } + + if (str.equals(COLLECTION_KEY)) { + while ((str = br.readLine()) != null) { + if (!processRecord(str, SEPARATOR_FOR_KEY_VALUE_ALL_COL, SEPARATOR_ITEMS_ALL_COL)) { + return false; + } + } + } else if (str.equals(COLLECTION_KEY_ONE_COL)) { + while ((str = br.readLine()) != null) { + if (!processRecord(str, SEPARATOR_FOR_KEY_VALUE_ONE_TYPE_COL, SEPARATOR_ITEMS_ONE_TYPE_COL)) { + return false; + } } - storages.put(record[0], collection); } } catch (IOException e) { - e.printStackTrace(); return false; } return true; @@ -195,14 +295,11 @@ public class StorageCollection { /** * Создание коллекции по типу */ - private ICollectionGenericObjects createCollection(CollectionType collectionType) { - switch (collectionType) { - case Massive: - return new MassiveGenericObjects<>(); - case List: - return new ListGenericObjects<>(); - default: - return null; - } + private static ICollectionGenericObjects createCollection(CollectionType collectionType) { + return switch (collectionType) { + case Massive -> new MassiveGenericObjects<>(); + case List -> new ListGenericObjects<>(); + default -> null; + }; } } diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningAirFighter.java b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningAirFighter.java index de73e75..7251a64 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningAirFighter.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningAirFighter.java @@ -6,14 +6,14 @@ import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; public class DrawningAirFighter extends DrawningWarPlane { - public DrawningAirFighter(int speed, double weight, Color bodyColor, Color + public DrawningAirFighter(int speed, double weight, Color bodyColor, IDrawableExtras engineDrawing, Color additionalColor, boolean bodyRockets, boolean additionalWings) { - super(speed, weight, bodyColor); - entityWarPlane = new EntityAirFighter(speed, weight, bodyColor, additionalColor, bodyRockets, additionalWings); + super(speed, weight, bodyColor, engineDrawing); + entityWarPlane = new EntityAirFighter(speed, weight, bodyColor, engineDrawing, additionalColor, bodyRockets, additionalWings); } - public DrawningAirFighter(EntityAirFighter entityAirFighter, IDrawableExtras engineDrawing) { - super(entityAirFighter, engineDrawing); + public DrawningAirFighter(EntityAirFighter entityAirFighter) { + super(entityAirFighter); } public DrawningAirFighter(EntityWarPlane entityWarPlane) { diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningWarPlane.java b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningWarPlane.java index b80efde..61da9d6 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningWarPlane.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningWarPlane.java @@ -1,12 +1,9 @@ package com.projectairfighter.drawnings; -import com.projectairfighter.entities.EntityAirFighter; import com.projectairfighter.entities.EntityWarPlane; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; -import java.util.Random; - public class DrawningWarPlane { // Сущность public EntityWarPlane entityWarPlane; @@ -21,28 +18,18 @@ public class DrawningWarPlane { private final int drawningAirFighterWidth = 157; private final int drawningAirFighterHeight = 140; - - private IDrawableExtras engineDrawing; public Integer getPosX(){ return startPosX; } public Integer getPosY(){ return startPosY; } - - public IDrawableExtras getEngineDrawing() { - return engineDrawing; - } - public int getWidth(){ return drawningAirFighterWidth; } public int getHeight(){ return drawningAirFighterHeight; } - public void setEngineDrawing(IDrawableExtras engineDrawing) { - this.engineDrawing = engineDrawing; - } protected DrawningWarPlane() { pictureWidth = 0; @@ -51,22 +38,8 @@ public class DrawningWarPlane { startPosY = null; } - public DrawningWarPlane(int speed, double weight, Color bodyColor) { - entityWarPlane = new EntityWarPlane(speed, weight, bodyColor); - IDrawableExtras[] engineDrawings = { - new EllipticalEngineDrawing(), - new TriangleEngineDrawing(), - new RectangleEngineDrawing() - }; - - Random random = new Random(); - engineDrawing = engineDrawings[random.nextInt(engineDrawings.length)]; - engineDrawing.setCountEngines(random.nextInt(7)); - } - - public DrawningWarPlane(EntityWarPlane entityWarPlane, IDrawableExtras engineDrawing){ - this.entityWarPlane = entityWarPlane; - this.engineDrawing = engineDrawing; + public DrawningWarPlane(int speed, double weight, Color bodyColor, IDrawableExtras engineDrawing) { + entityWarPlane = new EntityWarPlane(speed, weight, bodyColor, engineDrawing); } public DrawningWarPlane(EntityWarPlane entityWarPlane) @@ -75,8 +48,8 @@ public class DrawningWarPlane { this.entityWarPlane = entityWarPlane; } - public boolean setPictureSize(int width, int height) { - if (width <= drawningAirFighterWidth || height <= drawningAirFighterHeight) return false; + public void setPictureSize(int width, int height) { + if (width <= drawningAirFighterWidth || height <= drawningAirFighterHeight) return; pictureWidth = width; pictureHeight = height; if (startPosX != null && startPosY != null) { @@ -87,7 +60,6 @@ public class DrawningWarPlane { startPosY = pictureHeight - drawningAirFighterHeight; } } - return true; } public void setPosition(int x, int y) { @@ -141,7 +113,7 @@ public class DrawningWarPlane { if (pictureWidth == 0 || pictureHeight == 0) return; - engineDrawing.drawEngine(gc, entityWarPlane.getBodyColor(), getPosX(), getPosY()); + entityWarPlane.getEngineDrawing().drawEngine(gc, entityWarPlane.getBodyColor(), getPosX(), getPosY()); gc.setFill(entityWarPlane.getBodyColor()); gc.setStroke(entityWarPlane.getBodyColor()); @@ -173,29 +145,4 @@ public class DrawningWarPlane { new double[]{startPosY + 79, startPosY + 133, startPosY + 133, startPosY + 79}, 4); } - - private static final String SEPARATOR_FOR_OBJECT = ":"; - - /** - * Создание объекта из строки. - * - * @param info Строка с данными для создания объекта. - * @return Объект. - */ - public static DrawningWarPlane createDrawingPlane(String info) { - String[] strs = info.split(SEPARATOR_FOR_OBJECT); - EntityWarPlane plane = EntityAirFighter.createEntityAirFighter(strs); - if (plane != null) { - return new DrawningAirFighter(plane); - } - - plane = EntityWarPlane.createEntityWarPlane(strs); - if (plane != null) { - return new DrawningWarPlane(plane); - } - - return null; - } - - public abstract String getDataForSave(); } diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/EllipticalEngineDrawing.java b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/EllipticalEngineDrawing.java index a952109..783e8d6 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/EllipticalEngineDrawing.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/EllipticalEngineDrawing.java @@ -21,6 +21,11 @@ public class EllipticalEngineDrawing implements IDrawableExtras { } } + @Override + public int getCountEngines() { + return engineCount.getValue(); + } + @Override public void drawEngine(GraphicsContext gc, Color color, int startPosX, int startPosY) { double engineWidth = 6; diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/EngineCount.java b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/EngineCount.java index a7f6f00..a3bc143 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/EngineCount.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/EngineCount.java @@ -9,5 +9,5 @@ public enum EngineCount { EngineCount(int Value) { value = Value; } - public int getValue() { return value; } + public int getValue() { return this.value; } } diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/IDrawableExtras.java b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/IDrawableExtras.java index aa86ef4..1e3787b 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/IDrawableExtras.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/IDrawableExtras.java @@ -5,5 +5,6 @@ import javafx.scene.paint.Color; public interface IDrawableExtras { void setCountEngines(int countEngines); + int getCountEngines(); void drawEngine(GraphicsContext gc, Color color, int startPosX, int startPosY); } diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/RectangleEngineDrawing.java b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/RectangleEngineDrawing.java index 7522781..a6d31dd 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/RectangleEngineDrawing.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/RectangleEngineDrawing.java @@ -21,6 +21,11 @@ public class RectangleEngineDrawing implements IDrawableExtras { } } + @Override + public int getCountEngines() { + return engineCount.getValue(); + } + @Override public void drawEngine(GraphicsContext gc, Color color, int startPosX, int startPosY) { double engineWidth = 6; diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/TriangleEngineDrawing.java b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/TriangleEngineDrawing.java index 7603a62..d889d1c 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/TriangleEngineDrawing.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/TriangleEngineDrawing.java @@ -21,6 +21,11 @@ public class TriangleEngineDrawing implements IDrawableExtras { } } + @Override + public int getCountEngines() { + return engineCount.getValue(); + } + @Override public void drawEngine(GraphicsContext gc, Color color, int startPosX, int startPosY) { double engineWidth = 6; diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityAirFighter.java b/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityAirFighter.java index 31afeca..f909a1a 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityAirFighter.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityAirFighter.java @@ -1,5 +1,9 @@ package com.projectairfighter.entities; +import com.projectairfighter.drawnings.EllipticalEngineDrawing; +import com.projectairfighter.drawnings.IDrawableExtras; +import com.projectairfighter.drawnings.RectangleEngineDrawing; +import com.projectairfighter.drawnings.TriangleEngineDrawing; import javafx.scene.paint.Color; public class EntityAirFighter extends EntityWarPlane { @@ -34,9 +38,9 @@ public class EntityAirFighter extends EntityWarPlane { } // Конструктор - public EntityAirFighter(int speed, double weight, Color bodyColor, Color + public EntityAirFighter(int speed, double weight, Color bodyColor, IDrawableExtras engineDrawing, Color additionalColor, boolean bodyRockets, boolean additionalWings){ - super(speed, weight, bodyColor); + super(speed, weight, bodyColor, engineDrawing); this.additionalColor = additionalColor; this.bodyRockets = bodyRockets; this.additionalWings = additionalWings; @@ -51,10 +55,12 @@ public class EntityAirFighter extends EntityWarPlane { "EntityAirFighter", String.valueOf(getSpeed()), String.valueOf(getWeight()), - getBodyColor().toString(), // Здесь предполагается, что у вас есть метод toString, возвращающий имя цвета - getAdditionalColor().toString(), // Аналогично для дополнительного цвета - String.valueOf(hasBodyRockets()), - String.valueOf(hasAdditionalWings()) + String.valueOf(getBodyColor()), + String.valueOf(getEngineDrawing().getCountEngines()), + getEngineDrawing().getClass().getSimpleName(), + String.valueOf(additionalColor), + String.valueOf(bodyRockets), + String.valueOf(additionalWings) }; } @@ -62,17 +68,26 @@ public class EntityAirFighter extends EntityWarPlane { * Создание объекта из массива строк */ public static EntityAirFighter createEntityAirFighter(String[] strs) { - if (strs.length != 7 || !"EntityAirFighter".equals(strs[0])) { + if (strs.length != 9 || !"EntityAirFighter".equals(strs[0])) { return null; } int speed = Integer.parseInt(strs[1]); double weight = Double.parseDouble(strs[2]); - Color bodyColor = Color.valueOf(strs[3]); // Здесь предполагается, что Color.valueOf может обработать имя цвета - Color additionalColor = Color.valueOf(strs[4]); - boolean bodyRockets = Boolean.parseBoolean(strs[5]); - boolean additionalWings = Boolean.parseBoolean(strs[6]); + Color bodyColor = Color.valueOf(strs[3]); + int countEngines = Integer.parseInt(strs[4]); + IDrawableExtras engineDrawing = switch (strs[5]) { + case "RectangleEngineDrawing" -> new RectangleEngineDrawing(); + case "TriangleEngineDrawing" -> new TriangleEngineDrawing(); + case "EllipticalEngineDrawing" -> new EllipticalEngineDrawing(); + default -> null; + }; + Color additionalColor = Color.valueOf(strs[6]); + boolean bodyRockets = Boolean.parseBoolean(strs[7]); + boolean additionalWings = Boolean.parseBoolean(strs[8]); - return new EntityAirFighter(speed, weight, bodyColor, additionalColor, bodyRockets, additionalWings); + if (engineDrawing != null) engineDrawing.setCountEngines(countEngines); + + return new EntityAirFighter(speed, weight, bodyColor, engineDrawing, additionalColor, bodyRockets, additionalWings); } } diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityWarPlane.java b/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityWarPlane.java index cf7548d..00d3157 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityWarPlane.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityWarPlane.java @@ -1,5 +1,9 @@ package com.projectairfighter.entities; +import com.projectairfighter.drawnings.EllipticalEngineDrawing; +import com.projectairfighter.drawnings.IDrawableExtras; +import com.projectairfighter.drawnings.RectangleEngineDrawing; +import com.projectairfighter.drawnings.TriangleEngineDrawing; import javafx.scene.paint.Color; public class EntityWarPlane { @@ -9,31 +13,43 @@ public class EntityWarPlane { private double weight; // Основной цвет private Color bodyColor; + private IDrawableExtras engineDrawing; public double getStep() { return speed * 100 / weight; } - public Color getBodyColor() { return bodyColor; } + public int getSpeed() { + return speed; + } + public double getWeight() { + return weight; + } + public IDrawableExtras getEngineDrawing() { + return engineDrawing; + } + public void setBodyColor(Color bodyColor) { this.bodyColor = bodyColor; } - public void setSpeed(int speed) { this.speed = speed; } - public void setWeight(double weight) { this.weight = weight; } + public void setEngineDrawing(IDrawableExtras engineDrawing) { + this.engineDrawing = engineDrawing; + } - public EntityWarPlane(int speed, double weight, Color bodyColor){ + public EntityWarPlane(int speed, double weight, Color bodyColor, IDrawableExtras engineDrawing){ this.speed = speed; this.weight = weight; this.bodyColor = bodyColor; + this.engineDrawing = engineDrawing; } /** @@ -44,7 +60,9 @@ public class EntityWarPlane { "EntityWarPlane", String.valueOf(speed), String.valueOf(weight), - getBodyColor().toString() + getBodyColor().toString(), + String.valueOf(engineDrawing.getCountEngines()), + engineDrawing.getClass().getSimpleName() }; } @@ -54,13 +72,23 @@ public class EntityWarPlane { * @return Объект класса EntityWarPlane или null, если строка недействительна. */ public static EntityWarPlane createEntityWarPlane(String[] strs) { - if (strs.length != 4 || !strs[0].equals("EntityWarPlane")) { + if (strs.length != 6 || !strs[0].equals("EntityWarPlane")) { return null; } + int speed = Integer.parseInt(strs[1]); double weight = Double.parseDouble(strs[2]); - Color bodyColor = Color.valueOf(strs[3]); // Должен быть реализован метод valueOf для Color + Color bodyColor = Color.valueOf(strs[3]); + int countEngine = Integer.parseInt(strs[4]); + IDrawableExtras engineDrawing = switch (strs[5]) { + case "RectangleEngineDrawing" -> new RectangleEngineDrawing(); + case "TriangleEngineDrawing" -> new TriangleEngineDrawing(); + case "EllipticalEngineDrawing" -> new EllipticalEngineDrawing(); + default -> null; + }; - return new EntityWarPlane(speed, weight, bodyColor); + if (engineDrawing != null) engineDrawing.setCountEngines(countEngine); + + return new EntityWarPlane(speed, weight, bodyColor, engineDrawing); } } diff --git a/ProjectAirFighter/src/main/resources/com/projectairfighter/FormWarPlaneCollection.fxml b/ProjectAirFighter/src/main/resources/com/projectairfighter/FormWarPlaneCollection.fxml index 34ead7a..75eadb6 100644 --- a/ProjectAirFighter/src/main/resources/com/projectairfighter/FormWarPlaneCollection.fxml +++ b/ProjectAirFighter/src/main/resources/com/projectairfighter/FormWarPlaneCollection.fxml @@ -1,97 +1,94 @@ - - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - - - - - - - - - - - -