diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/FormWarPlaneCollection.java b/ProjectAirFighter/src/main/java/com/projectairfighter/FormWarPlaneCollection.java index 525982e..eea5f37 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/FormWarPlaneCollection.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/FormWarPlaneCollection.java @@ -293,7 +293,7 @@ public class FormWarPlaneCollection extends Application implements Initializable canvasWarPlane = (Canvas) loader.getNamespace().get("canvasWarPlane"); comboBox = (ComboBox) loader.getNamespace().get("comboBox"); comboBox.getItems().addAll("Хранилище"); - Scene scene = new Scene(root, 1292, 765); + Scene scene = new Scene(root, 1292, 795); primaryStage.setTitle("Коллекция истребителей"); primaryStage.setScene(scene); primaryStage.show(); diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/ICollectionGenericObjects.java b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/ICollectionGenericObjects.java index 0a973d6..b7bb006 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/ICollectionGenericObjects.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/ICollectionGenericObjects.java @@ -9,8 +9,9 @@ public interface ICollectionGenericObjects { /** * Установка максимального количества элементов */ - void setMaxCount(int maxCount); + int getMaxCount(); + void setMaxCount(int value); /** * Добавление объекта в коллекцию * @@ -43,5 +44,19 @@ public interface ICollectionGenericObjects { * @return Объект или null, если объекта с такой позицией нет */ T get(int position); + + /** + * Получение типа коллекции. + * + * @return Тип коллекции. + */ + CollectionType getCollectionType(); + + /** + * Получение объектов коллекции по одному. + * + * @return Поэлементный вывод элементов коллекции. + */ + Iterable getItems(); } diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/ListGenericObjects.java b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/ListGenericObjects.java index aa73a2a..b220a2f 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/ListGenericObjects.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/ListGenericObjects.java @@ -1,7 +1,9 @@ package com.projectairfighter.collectiongenericobjects; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; +import java.util.NoSuchElementException; public class ListGenericObjects implements ICollectionGenericObjects { private final List collection; @@ -12,6 +14,11 @@ public class ListGenericObjects implements ICollectionGenericObjects { return collection.size(); } + @Override + public int getMaxCount() { + return maxCount; + } + @Override public void setMaxCount(int value) { if (value > 0) { @@ -32,6 +39,41 @@ public class ListGenericObjects implements ICollectionGenericObjects { } } + @Override + public CollectionType getCollectionType() { + return CollectionType.List; + } + + /** + * Получение объектов коллекции по одному. + * + * @return Поэлементный вывод элементов коллекции. + */ + @Override + public Iterable getItems() { + return () -> new Iterator() { + private int currentIndex = 0; + + @Override + public boolean hasNext() { + return currentIndex < collection.size(); + } + + @Override + public T next() { + if (!hasNext()) { + throw new NoSuchElementException(); + } + return collection.get(currentIndex++); + } + + @Override + public void remove() { + throw new UnsupportedOperationException("Оператор не поддерживается"); + } + }; + } + @Override public int insert(T obj) { if (getCount() == maxCount) { diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/MassiveGenericObjects.java b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/MassiveGenericObjects.java index 57f47e2..52c229e 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/MassiveGenericObjects.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/MassiveGenericObjects.java @@ -12,15 +12,26 @@ public class MassiveGenericObjects implements ICollectionGenericObjects { @Override @SuppressWarnings("unchecked") - public void setMaxCount(int value) { - if (value > 0) { - if (collection.length > 0) { - collection = Arrays.copyOf(collection, value); - } else { - collection = (T[]) new Object[value]; - } - } + public int getMaxCount() { + return collection.length; } + + @Override + @SuppressWarnings("unchecked") + 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; + } + @SuppressWarnings("unchecked") public MassiveGenericObjects() { collection = (T[]) new Object[0]; diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/StorageCollection.java b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/StorageCollection.java index 9b0d277..edc9a2d 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/StorageCollection.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/collectiongenericobjects/StorageCollection.java @@ -1,18 +1,38 @@ package com.projectairfighter.collectiongenericobjects; +import com.projectairfighter.drawnings.DrawningWarPlane; + +import java.io.*; import java.util.*; +import java.util.regex.Pattern; /** * Класс-хранилище коллекций. * * @param Тип элементов коллекций. */ -public class StorageCollection { +public class StorageCollection { /** * Словарь (хранилище) с коллекциями. */ private final Map> storages; + /** + * Ключевое слово, с которого должен начинаться файл + */ + private final String collectionKey = "CollectionsStorage"; + + /** + * Разделитель для записи ключа и значения элемента словаря + */ + private final String separatorForKeyValue = "|"; + + /** + * Разделитель для записей коллекции данных в файл + */ + private final String separatorItems = ";"; + + /** * Возвращение списка названий коллекций. * @@ -86,4 +106,103 @@ public class StorageCollection { public T getElement(String name, int index) { return this.get(name).get(index); } + + /** + * Сохранение информации в файл + */ + public boolean saveData(String filename) { + // Проверяем, не пуста ли коллекция + if (storages.isEmpty()) { + return false; + } + + // Удаляем файл, если он существует + File file = new File(filename); + if (file.exists()) { + file.delete(); + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + // Записываем ключ коллекции + writer.write(collectionKey); + 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(entry.getValue().getCollectionType()); + sb.append(separatorForKeyValue); + sb.append(entry.getValue().getMaxCount()); + sb.append(separatorForKeyValue); + + // Сохраняем каждый элемент в коллекции + for (T item : entry.getValue().getItems()) { + if (item == null) continue; // Проверка на null + String data = item.getDataForSave(); + if (data == null || data.isEmpty()) continue; + sb.append(data); + sb.append(separatorItems); + } + + writer.write(sb.toString()); + writer.newLine(); + } + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * Загрузка информации из файла + */ + public boolean loadData(String filename) { + if (!new File(filename).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; + } + storages.put(record[0], collection); + } + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + + /** + * Создание коллекции по типу + */ + private ICollectionGenericObjects createCollection(CollectionType collectionType) { + switch (collectionType) { + case Massive: + return new MassiveGenericObjects<>(); + case List: + return new ListGenericObjects<>(); + default: + return null; + } + } } diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningAirFighter.java b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningAirFighter.java index 6555cc2..de73e75 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningAirFighter.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningAirFighter.java @@ -1,6 +1,7 @@ package com.projectairfighter.drawnings; import com.projectairfighter.entities.EntityAirFighter; +import com.projectairfighter.entities.EntityWarPlane; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; @@ -11,10 +12,15 @@ public class DrawningAirFighter extends DrawningWarPlane { entityWarPlane = new EntityAirFighter(speed, weight, bodyColor, additionalColor, bodyRockets, additionalWings); } - public DrawningAirFighter(EntityAirFighter entityAirFighter, IDrawableExtras engineDrawing){ + public DrawningAirFighter(EntityAirFighter entityAirFighter, IDrawableExtras engineDrawing) { super(entityAirFighter, engineDrawing); } + public DrawningAirFighter(EntityWarPlane entityWarPlane) { + super(); + this.entityWarPlane = entityWarPlane; + } + // Прорисовка объекта @Override public void drawTransport(GraphicsContext gc) { diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningWarPlane.java b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningWarPlane.java index 6998ec8..b80efde 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningWarPlane.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/DrawningWarPlane.java @@ -1,5 +1,6 @@ package com.projectairfighter.drawnings; +import com.projectairfighter.entities.EntityAirFighter; import com.projectairfighter.entities.EntityWarPlane; import javafx.scene.canvas.GraphicsContext; import javafx.scene.paint.Color; @@ -68,6 +69,12 @@ public class DrawningWarPlane { this.engineDrawing = engineDrawing; } + public DrawningWarPlane(EntityWarPlane entityWarPlane) + { + super(); + this.entityWarPlane = entityWarPlane; + } + public boolean setPictureSize(int width, int height) { if (width <= drawningAirFighterWidth || height <= drawningAirFighterHeight) return false; pictureWidth = width; @@ -166,4 +173,29 @@ 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/ExtensionDrawningPlane.java b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/ExtensionDrawningPlane.java new file mode 100644 index 0000000..0b9b9a6 --- /dev/null +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/drawnings/ExtensionDrawningPlane.java @@ -0,0 +1,44 @@ +package com.projectairfighter.drawnings; + +import com.projectairfighter.entities.EntityAirFighter; +import com.projectairfighter.entities.EntityWarPlane; + +public class ExtensionDrawningPlane { + 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; + } + + /** + * Получение данных для сохранения в файл. + * + * @param drawningWarPlane Сохраняемый объект. + * @return Строка с данными по объекту. + */ + public static String getDataForSave(DrawningWarPlane drawningWarPlane) { + if (drawningWarPlane == null || drawningWarPlane.entityWarPlane == null) { + return ""; + } + + String[] array = drawningWarPlane.entityWarPlane.getStringRepresentation(); + return String.join(SEPARATOR_FOR_OBJECT, array); + } +} diff --git a/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityAirFighter.java b/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityAirFighter.java index 1010f31..31afeca 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityAirFighter.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityAirFighter.java @@ -41,4 +41,38 @@ public class EntityAirFighter extends EntityWarPlane { this.bodyRockets = bodyRockets; this.additionalWings = additionalWings; } + + /** + * Получение строк со значениями свойств объекта класса-сущности + */ + @Override + public String[] getStringRepresentation() { + return new String[] { + "EntityAirFighter", + String.valueOf(getSpeed()), + String.valueOf(getWeight()), + getBodyColor().toString(), // Здесь предполагается, что у вас есть метод toString, возвращающий имя цвета + getAdditionalColor().toString(), // Аналогично для дополнительного цвета + String.valueOf(hasBodyRockets()), + String.valueOf(hasAdditionalWings()) + }; + } + + /** + * Создание объекта из массива строк + */ + public static EntityAirFighter createEntityAirFighter(String[] strs) { + if (strs.length != 7 || !"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]); + + return new EntityAirFighter(speed, weight, bodyColor, 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 cccb30a..cf7548d 100644 --- a/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityWarPlane.java +++ b/ProjectAirFighter/src/main/java/com/projectairfighter/entities/EntityWarPlane.java @@ -35,4 +35,32 @@ public class EntityWarPlane { this.weight = weight; this.bodyColor = bodyColor; } + + /** + * Получение строк со значениями свойств объекта класса-сущности. + */ + public String[] getStringRepresentation() { + return new String[] { + "EntityWarPlane", + String.valueOf(speed), + String.valueOf(weight), + getBodyColor().toString() + }; + } + + /** + * Создание объекта из массива строк. + * @param strs Массив строк с данными для создания объекта. + * @return Объект класса EntityWarPlane или null, если строка недействительна. + */ + public static EntityWarPlane createEntityWarPlane(String[] strs) { + if (strs.length != 4 || !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 + + return new EntityWarPlane(speed, weight, bodyColor); + } } diff --git a/ProjectAirFighter/src/main/resources/com/projectairfighter/FormWarPlaneCollection.fxml b/ProjectAirFighter/src/main/resources/com/projectairfighter/FormWarPlaneCollection.fxml index ffa9aad..34ead7a 100644 --- a/ProjectAirFighter/src/main/resources/com/projectairfighter/FormWarPlaneCollection.fxml +++ b/ProjectAirFighter/src/main/resources/com/projectairfighter/FormWarPlaneCollection.fxml @@ -1,47 +1,97 @@ - - - - + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - -