diff --git a/Tank/src/ExtentionDrawingTank.java b/Tank/src/ExtentionDrawingTank.java new file mode 100644 index 0000000..f1b644c --- /dev/null +++ b/Tank/src/ExtentionDrawingTank.java @@ -0,0 +1,77 @@ +import java.awt.Color; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import java.util.Vector; + +public class ExtentionDrawingTank { + // Создание объекта из строки + public static DrawingArmoVehicle CreateDrawingTank(String info, String separatorForObject, int width, int height) { + String[] strs = info.split(separatorForObject); + if (strs.length == 5) + { + String[] colorValues = strs[2].split(","); + + DrawingArmoVehicle drawingVehicle = new DrawingArmoVehicle(Integer.parseInt(strs[0]), (double)Integer.parseInt(strs[1]), + new Color(Integer.parseInt(colorValues[0].replaceAll("\\D", "")), + Integer.parseInt(colorValues[1].replaceAll("\\D", "")), + Integer.parseInt(colorValues[2].replaceAll("\\D", ""))), + Integer.parseInt(strs[3]), + width, height + ); + + try{ + drawingVehicle.OrnamentsForm = (IOrnamentForm) Class.forName(strs[4]).getDeclaredConstructor().newInstance(); + drawingVehicle.OrnamentsForm.setDigit(drawingVehicle.ArmoVehicle.numWheel); + } catch (Exception e) { + return null; + } + return drawingVehicle; + } + + if(strs.length == 9) { + String[] colorValues = strs[2].split(","); + String[] colorValues2 = strs[5].split(","); + DrawingTank drawingTank = new DrawingTank( + Integer.parseInt(strs[0]), + (float)Integer.parseInt(strs[1]), + new Color( + Integer.parseInt(colorValues[0].replaceAll("\\D", "")), + Integer.parseInt(colorValues[1].replaceAll("\\D", "")), + Integer.parseInt(colorValues[2].replaceAll("\\D", "")) + ), + Integer.parseInt(strs[3]), + new Color( + Integer.parseInt(colorValues2[0].replaceAll("\\D", "")), + Integer.parseInt(colorValues2[1].replaceAll("\\D", "")), + Integer.parseInt(colorValues2[2].replaceAll("\\D", "")) + ), + strs[6].equals("true"), + strs[7].equals("true"), + strs[8].equals("true"), + width, height + ); + try { + drawingTank.OrnamentsForm = (IOrnamentForm)Class.forName(strs[4]).getDeclaredConstructor().newInstance(); + drawingTank.OrnamentsForm.setDigit(drawingTank.ArmoVehicle.numWheel); + } catch (Exception e) { + return null; + } + return drawingTank; + } + return null; + } + + // Получение данных для сохранения в файл + public static String GetDataForSave(DrawingArmoVehicle drawingArmoVehicle, String separatorForObject) { + EntityArmoVehicle vehicle = drawingArmoVehicle.ArmoVehicle; + if (vehicle == null) { + return null; + } + + String str = "" + vehicle.Speed + separatorForObject + (int)vehicle.Weight + separatorForObject + vehicle.BodyColor + separatorForObject + vehicle.numWheel + separatorForObject + drawingArmoVehicle.OrnamentsForm.getClass().getName(); + if (!(vehicle instanceof EntityTank)) { + return str; + } + return str+separatorForObject+((EntityTank)vehicle).AdditionalColor.toString()+separatorForObject+((EntityTank)vehicle).BodyKit+separatorForObject+((EntityTank)vehicle).Caterpillar+separatorForObject+((EntityTank)vehicle).Tower; + } +} \ No newline at end of file diff --git a/Tank/src/FormTankCollection.java b/Tank/src/FormTankCollection.java index a0b96b0..bd5f100 100644 --- a/Tank/src/FormTankCollection.java +++ b/Tank/src/FormTankCollection.java @@ -4,6 +4,12 @@ import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JFileChooser; +import javax.swing.filechooser.FileNameExtensionFilter; import java.util.LinkedList; import java.util.Queue; @@ -206,6 +212,120 @@ public class FormTankCollection { } ); + // Создаём панель меню + JMenuBar menuBar = new JMenuBar(); + + // Создаём пункты меню + JMenu fileMenu = new JMenu("File"); + + // Создаём пункты меню + JMenuItem openItem = new JMenuItem("Открыть"); + openItem.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent e) { + JFileChooser fileChooser = new JFileChooser(); + + fileChooser.setDialogTitle("Выберите файл для загрузки данных"); + + // Установка фильтра для файлов с определённым расширеним (например, txt) + fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt")); + + fileChooser.setDialogTitle("Выберите файл для загрузки данных"); + if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + if (_storage.LoadData(selectedFile.getAbsolutePath())) { + JOptionPane.showMessageDialog(null, "Загрузка прошла успешно", "Результат", JOptionPane.INFORMATION_MESSAGE); + } else { + JOptionPane.showMessageDialog(null, "Не загрузилось", "Результат", JOptionPane.ERROR_MESSAGE); + } + } + ReloadObjects(); + } + }); + + JMenuItem saveItem = new JMenuItem("Сохранить"); + saveItem.addActionListener( + new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setDialogTitle("Выберите файл для сохранения данных"); + + // Установка фильтра для файлов с определённым расширением (например, txt) + fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt")); + + if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + if(_storage.SaveData(selectedFile.getAbsolutePath())) + JOptionPane.showMessageDialog(null, "Сохранение прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE); + else + JOptionPane.showMessageDialog(null, "Не сохранилось", "Результат", JOptionPane.ERROR_MESSAGE); + } + } + } + ); + + JMenuItem openItemSingle = new JMenuItem("Открыть одиночный"); + openItemSingle.addActionListener( + new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser fileChooser = new JFileChooser(); + + fileChooser.setDialogTitle("Выберите файл для загрузки данных"); + + //Установка фильтра для файлов с определённым расширением (например, txt) + fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt")); + + fileChooser.setDialogTitle("Выберите файл для загрузки данных"); + if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + + if (_storage.LoadDataSingle(selectedFile.getAbsolutePath())) { + JOptionPane.showMessageDialog(null, "Загрузка прошла успешно", "Результат", JOptionPane.INFORMATION_MESSAGE); + } else { + JOptionPane.showMessageDialog(null, "Не загрузилось", "Результат", JOptionPane.ERROR_MESSAGE); + } + } + ReloadObjects(); + } + }); + + JMenuItem saveItemSingle = new JMenuItem("Сохранение одиночного"); + saveItemSingle.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent e){ + if (jListStorage.getSelectedValue() == null){ + JOptionPane.showMessageDialog(null, "Не выбран гараж", "Ошибка", JOptionPane.ERROR_MESSAGE); + return; + } + + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setDialogTitle("Выберите файл для сохранения данных"); + + // Установка фильтра для файлов с определенным расширением (например, .txt) + fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt")); + + if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { + File selectedFile = fileChooser.getSelectedFile(); + if (_storage.SaveDataSingle(selectedFile.getAbsolutePath(), jListStorage.getSelectedValue())) + JOptionPane.showMessageDialog(null, "Сохранение прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE); + else + JOptionPane.showMessageDialog(null, "Не сохранилось", "Результат", JOptionPane.ERROR_MESSAGE); + } + } + } + ); + + // Добавляем пункты в меню + fileMenu.add(openItem); + fileMenu.add(saveItem); + fileMenu.add(openItemSingle); + fileMenu.add(saveItemSingle); + + // Добавляем меню в панель меню + menuBar.add(fileMenu); + Frame.setSize(880, 520); Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Frame.setLayout(null); @@ -223,6 +343,8 @@ public class FormTankCollection { buttonGetRemoved.setBounds(pictureBoxWidth - 10, 390, 170, 20); + menuBar.setBounds(pictureBoxWidth - 10, 420, 170, 20); + Frame.add(canv); Frame.add(ButtonAddVehicle); Frame.add(ButtonRemoveTank); @@ -236,6 +358,7 @@ public class FormTankCollection { Frame.add(buttonRemoveSet); Frame.add(buttonGetRemoved); + Frame.add(menuBar); Frame.setVisible(true); } diff --git a/Tank/src/SetGeneric.java b/Tank/src/SetGeneric.java index 7ab88d6..a404521 100644 --- a/Tank/src/SetGeneric.java +++ b/Tank/src/SetGeneric.java @@ -86,4 +86,5 @@ public class SetGeneric { } }; } + public void clear() { _places.clear(); } } \ No newline at end of file diff --git a/Tank/src/TanksGenericCollections.java b/Tank/src/TanksGenericCollections.java index 6a9654b..8632d9c 100644 --- a/Tank/src/TanksGenericCollections.java +++ b/Tank/src/TanksGenericCollections.java @@ -14,6 +14,11 @@ public class TanksGenericCollections _collection; + // Получение объектов коллекции + public Iterable getTanks(final Integer maxTanks) { return _collection.GetTanks(maxTanks); } + + public void clear() { _collection.clear(); } + // Конструктор public TanksGenericCollections(int pictureWidth, int pictureHeight) { int width = pictureWidth / _placeSizeWidth; diff --git a/Tank/src/TanksGenericStorage.java b/Tank/src/TanksGenericStorage.java index 4be661a..624d8d1 100644 --- a/Tank/src/TanksGenericStorage.java +++ b/Tank/src/TanksGenericStorage.java @@ -1,7 +1,174 @@ import java.util.*; import java.util.stream.Collectors; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Map; public class TanksGenericStorage { + // Разделитель для записи ключа и значения элемента словаря + private static String _separatorForKeyValueWR = "|"; + private static String _separatorForKeyValue = "\\|"; + + // Разделитель для записей коллекции данных в файл + private String _separatorRecordsWR = ";"; + private String _separatorRecords = "\\;"; + + // Разделитель для записи информации по объекту в файл + private static String _separatorForObjectWR = ":"; + private static String _separatorForObject = "\\:"; + + public boolean SaveDataSingle(String filename, String key) { + if(new File(filename).exists()) { + new File(filename).delete(); + } + + StringBuilder data = new StringBuilder(); + data.append(key).append("\n"); + for (DrawingArmoVehicle elem: _tankStorages.get(key).getTanks(100)) { + if(_tankStorages.get(key) == null) + return false; + + if(_tankStorages.get(key) != null) + data.append(elem != null ? ExtentionDrawingTank.GetDataForSave(elem, _separatorForObjectWR) + "\n" : ""); + } + + if(data.length() == 0) + return false; + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) { + writer.write("TankStorageSingle" + System.lineSeparator() + data.toString()); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + public boolean LoadDataSingle(String filename) { + if(!new File(filename).exists()) { + return false; + } + + try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { + String s = reader.readLine(); + if(s == null || s.length() == 0) + return false; + + if(!s.startsWith("TankStorageSingle")) + return false; + + String key = reader.readLine(); + if(key == null || key.length() == 0) + return false; + + TanksGenericCollections collections = new TanksGenericCollections<>(_pictureWidth, _pictureHeight); + if (_tankStorages.containsKey(key)){ + collections = _tankStorages.get(key); + collections.clear(); + } + else + collections = new TanksGenericCollections<>(_pictureWidth, _pictureHeight); + + List tanksStrings = new ArrayList(); + + s = reader.readLine(); + while (s != null && s.length() != 0) { + tanksStrings.add(s); + s = reader.readLine(); + } + + Collections.reverse(tanksStrings); + for (String elem : tanksStrings) { + DrawingArmoVehicle vehicle = ExtentionDrawingTank.CreateDrawingTank(elem, _separatorForObject, _pictureWidth, _pictureHeight); + if(vehicle == null || collections.Add(vehicle) == -1) + return false; + } + + if(_tankStorages.containsKey(key)) + _tankStorages.remove(key); + _tankStorages.put(key, collections); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + + // Сохранение информации по технике в хранилище в файл + public boolean SaveData(String filename) { + if(new File(filename).exists()) { + new File(filename).delete(); + } + + StringBuilder data = new StringBuilder(); + + for (Map.Entry> record : _tankStorages.entrySet()) { + StringBuilder records = new StringBuilder(); + for (DrawingArmoVehicle elem : record.getValue().getTanks(100)) { + records.append(elem != null ? ExtentionDrawingTank.GetDataForSave(elem, _separatorForObjectWR) + _separatorRecordsWR : ""); + } + data.append(record.getKey()).append(_separatorForKeyValueWR).append(records).append("\n"); + } + + if (data.length() == 0) + return false; + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) { + writer.write("TankStorage" + System.lineSeparator() + data.toString()); + } 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 s = reader.readLine(); + if (s == null || s.length() == 0) + return false; + + if (!s.startsWith("TankStorage")) + return false; + + _tankStorages.clear(); + + s = reader.readLine(); + while (s != null && s.length() != 0) { + String[] record = s.split(_separatorForKeyValue); + s = reader.readLine(); + if (record.length != 2) { + continue; + } + TanksGenericCollections collection = new TanksGenericCollections<>(_pictureWidth, _pictureHeight); + String[] set = record[1].split(_separatorRecords); + List reversedSet = Arrays.asList(set); + Collections.reverse(reversedSet); + for (String elem : reversedSet) { + DrawingArmoVehicle vehicle = ExtentionDrawingTank.CreateDrawingTank(elem, _separatorForObject, _pictureWidth, _pictureHeight); + if (vehicle == null || collection.Add(vehicle) == -1) + return false; + } + _tankStorages.put(record[0], collection); + } + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } + // Словарь (как хранилище) HashMap> _tankStorages;