From a0bdbb026da07796fc9bab0a6aad061e4c61bf24 Mon Sep 17 00:00:00 2001 From: Factorino73 Date: Tue, 5 Dec 2023 12:09:24 +0400 Subject: [PATCH] PIbd-21_MasenkinMS_LabWork06 --- AccordionBus/BusCollectionForm.form | 33 +++-- AccordionBus/BusCollectionForm.java | 111 ++++++++++++++- AccordionBus/BusGenericCollection.java | 10 ++ AccordionBus/BusGenericStorage.java | 181 +++++++++++++++++++++++- AccordionBus/DrawingDoorsTypeOne.java | 8 ++ AccordionBus/DrawingDoorsTypeThree.java | 8 ++ AccordionBus/DrawingDoorsTypeTwo.java | 8 ++ AccordionBus/ExtensionDrawingBus.java | 94 ++++++++++++ AccordionBus/IDrawingDoors.java | 2 + AccordionBus/SetGeneric.java | 5 + 10 files changed, 446 insertions(+), 14 deletions(-) create mode 100644 AccordionBus/ExtensionDrawingBus.java diff --git a/AccordionBus/BusCollectionForm.form b/AccordionBus/BusCollectionForm.form index 117aad5..af5c77a 100644 --- a/AccordionBus/BusCollectionForm.form +++ b/AccordionBus/BusCollectionForm.form @@ -3,7 +3,7 @@ - + @@ -17,7 +17,7 @@ - + @@ -27,7 +27,7 @@ - + @@ -35,7 +35,7 @@ - + @@ -43,7 +43,7 @@ - + @@ -51,7 +51,7 @@ - + @@ -68,7 +68,7 @@ - + @@ -77,7 +77,7 @@ - + @@ -85,7 +85,7 @@ - + @@ -93,7 +93,7 @@ - + @@ -101,7 +101,7 @@ - + @@ -109,13 +109,22 @@ - + + + + + + + + + + diff --git a/AccordionBus/BusCollectionForm.java b/AccordionBus/BusCollectionForm.java index 576b7a6..c95c665 100644 --- a/AccordionBus/BusCollectionForm.java +++ b/AccordionBus/BusCollectionForm.java @@ -3,7 +3,11 @@ package AccordionBus; import javax.swing.*; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import javax.swing.filechooser.FileNameExtensionFilter; import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; import java.util.LinkedList; import java.util.Random; @@ -35,15 +39,33 @@ public class BusCollectionForm extends JFrame { private JList listStorages; private JButton buttonDeleteObject; private JButton buttonShowDeletedBus; + private JPanel toolbarPanel; + private JMenuBar menuBar = new JMenuBar(); + private JMenu fileMenu = new JMenu("Файл"); + private JMenuItem saveItem = new JMenuItem("Сохранение"); + private JMenuItem openItem = new JMenuItem("Загрузка"); + private JMenuItem saveCollectionItem = new JMenuItem("Сохранение коллекции"); + private JMenuItem openCollectionItem = new JMenuItem("Загрузка коллекции"); // Конструктор public BusCollectionForm() { pictureBoxCollection.setSize(new Dimension(700, 450)); _storage = new BusGenericStorage(pictureBoxCollection.getWidth(), pictureBoxCollection.getHeight()); _deletedBuses = new LinkedList(); + + // Модель списка listModel = new DefaultListModel(); listStorages.setModel(listModel); + // Выпадающее меню для работы с файлами + fileMenu.add(saveItem); + fileMenu.add(openItem); + fileMenu.add(saveCollectionItem); + fileMenu.add(openCollectionItem); + menuBar.add(fileMenu); + toolbarPanel.setLayout(new BorderLayout()); + toolbarPanel.add(menuBar); + // Добавление набора buttonAddObject.addActionListener(e -> { if (textFieldStorage.getText().length() == 0) { @@ -97,7 +119,7 @@ public class BusCollectionForm extends JFrame { JOptionPane.showMessageDialog(this.getMainPanel(), "Объект добавлен", "Успех", JOptionPane.INFORMATION_MESSAGE); } else { - JOptionPane.showMessageDialog(this.getMainPanel(), " Объект не добавлен", "Ошибка", JOptionPane.INFORMATION_MESSAGE); + JOptionPane.showMessageDialog(this.getMainPanel(), "Объект не добавлен", "Ошибка", JOptionPane.INFORMATION_MESSAGE); } } }); @@ -162,6 +184,93 @@ public class BusCollectionForm extends JFrame { frameAccordionBus.accordionBusForm.Draw(); frameAccordionBus.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); }); + + // Сохранить данные в файл + saveItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setDialogTitle("Сохранить"); + fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt")); + + if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + if (_storage.SaveData(file.getAbsolutePath())) { + JOptionPane.showMessageDialog(null, "Сохранение прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE); + } + else { + JOptionPane.showMessageDialog(null, "Не удалось сохранить данные", "Результат", JOptionPane.ERROR_MESSAGE); + } + } + } + }); + + // Сохранить коллекцию в файл + saveCollectionItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (listStorages.getSelectedIndex() == -1) { + JOptionPane.showMessageDialog(null, "Не выбрана коллекция", "Ошибка", JOptionPane.ERROR_MESSAGE); + return; + } + + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setDialogTitle("Сохранить коллекцию"); + fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt")); + + if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + if (_storage.SaveCollectionData(file.getAbsolutePath(), listStorages.getSelectedValue().toString())) { + JOptionPane.showMessageDialog(null, "Сохранение прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE); + } + else { + JOptionPane.showMessageDialog(null, "Не удалось сохранить данные", "Результат", JOptionPane.ERROR_MESSAGE); + } + } + } + }); + + // Загрузить данные из файла + openItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setDialogTitle("Загрузить"); + fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt")); + + if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + if (_storage.LoadData(file.getAbsolutePath())) { + JOptionPane.showMessageDialog(null, "Загрузка прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE); + } + else { + JOptionPane.showMessageDialog(null, "Не удалось загрузить данные", "Результат", JOptionPane.ERROR_MESSAGE); + } + } + ReloadObjects(); + } + }); + + // Загрузить коллекцию из файла + openCollectionItem.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + JFileChooser fileChooser = new JFileChooser(); + fileChooser.setDialogTitle("Загрузить коллекцию"); + fileChooser.setFileFilter(new FileNameExtensionFilter("Текстовые файлы (*.txt)", "txt")); + + if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { + File file = fileChooser.getSelectedFile(); + if (_storage.LoadCollectionData(file.getAbsolutePath())) { + JOptionPane.showMessageDialog(null, "Загрузка прошло успешно", "Результат", JOptionPane.INFORMATION_MESSAGE); + } + else { + JOptionPane.showMessageDialog(null, "Не удалось загрузить данные", "Результат", JOptionPane.ERROR_MESSAGE); + } + } + ReloadObjects(); + } + }); } // Заполнение ListBoxObject diff --git a/AccordionBus/BusGenericCollection.java b/AccordionBus/BusGenericCollection.java index 379e4aa..759f5ea 100644 --- a/AccordionBus/BusGenericCollection.java +++ b/AccordionBus/BusGenericCollection.java @@ -19,6 +19,11 @@ public class BusGenericCollection _collection; + // Получение объектов коллекции + public Iterable GetBuses(final Integer maxBuses) { + return _collection.GetBuses(maxBuses); + } + // Конструктор public BusGenericCollection(int picWidth, int picHeight) { int width = picWidth / _placeSizeWidth; @@ -49,6 +54,11 @@ public class BusGenericCollection>(); @@ -51,7 +66,7 @@ public class BusGenericStorage { return null; } - // Доступ к объекту из набору + // Доступ к объекту из набора public DrawingObjectBus get(String ind1, int ind2) { // Проверка наличия ключа if (_busStorages.containsKey(ind1)) { @@ -59,4 +74,168 @@ public class BusGenericStorage { } return null; } + + // Сохранение информации по автобусам в хранилище в файл + public boolean SaveData(String filename) { + if (new File(filename).exists()) { + new File(filename).delete(); + } + + StringBuilder data = new StringBuilder(); + for (Map.Entry> record : _busStorages.entrySet()) { + StringBuilder records = new StringBuilder(); + for (DrawingBus elem : record.getValue().GetBuses(100)) { + records.append(elem != null ? ExtensionDrawingBus.GetDataForSave(elem, _separatorForObjectWR) + _separatorRecordsWR : ""); + } + data.append(record.getKey() + _separatorForKeyValueWR + records + "\n"); + } + + if (data.length() == 0) { + return false; + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) { + writer.write("BusStorage" + System.lineSeparator() + data.toString()); + } + catch (IOException ex) { + ex.printStackTrace(); + return false; + } + + return true; + } + + // Сохранение информации по автобусам из коллекции хранилища в файл + public boolean SaveCollectionData(String filename, String key) { + if (new File(filename).exists()) { + new File(filename).delete(); + } + + StringBuilder data = new StringBuilder(); + data.append(key + "\n"); + for (DrawingBus elem : _busStorages.get(key).GetBuses(100)) { + data.append(elem != null ? ExtensionDrawingBus.GetDataForSave(elem, _separatorForObjectWR) + "\n" : ""); + } + + if (data.length() == 0) { + return false; + } + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) { + writer.write("BusCollectionStorage" + System.lineSeparator() + data.toString()); + } + catch (IOException ex) { + ex.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 line = reader.readLine(); + // Если строка пустая + if (line == null || line.length() == 0) { + return false; + } + // Если нет записи "BusStorage", то это не те данные + if (!line.startsWith("BusStorage")) { + return false; + } + + _busStorages.clear(); + + line = reader.readLine(); + while (line != null && line.length() != 0) { + String[] record = line.split(_separatorForKeyValue); + if (record.length != 2) { + continue; + } + + BusGenericCollection collection = new BusGenericCollection<>(_pictureWidth, _pictureHeight); + String[] set = record[1].split(_separatorRecords); + for (String elem : set) { + DrawingBus bus = ExtensionDrawingBus.CreateDrawingBus(elem, _separatorForObject, _pictureWidth, _pictureHeight); + if (bus != null) { + if (collection.plus(bus) == -1) { + return false; + } + } + } + + _busStorages.put(record[0], collection); + line = reader.readLine(); + } + } + catch (IOException ex) { + ex.printStackTrace(); + return false; + } + + return true; + } + + // Загрузка информации по автобусам в коллекцию хранилища из файла + public boolean LoadCollectionData(String filename) { + if (!new File(filename).exists()) { + return false; + } + + try (BufferedReader reader = new BufferedReader(new FileReader(filename))) { + String line = reader.readLine(); + // Если строка пустая + if (line == null || line.length() == 0) { + return false; + } + // Если нет записи "BusCollectionStorage", то это не те данные + if (!line.startsWith("BusCollectionStorage")) { + return false; + } + + String key = reader.readLine(); + // Если значение ключа пустое + if (key == null || key.length() == 0) { + return false; + } + + BusGenericCollection collection; + if (_busStorages.containsKey(key)) { + collection = _busStorages.get(key); + collection.Clear(); + } + else { + collection = new BusGenericCollection<>(_pictureWidth, _pictureHeight); + } + + List buses = new ArrayList(); + line = reader.readLine(); + while (line != null && line.length() != 0) { + buses.add(line); + line = reader.readLine(); + } + + for (String elem : buses) { + DrawingBus bus = ExtensionDrawingBus.CreateDrawingBus(elem, _separatorForObject, _pictureWidth, _pictureHeight); + if (bus != null) { + if (collection.plus(bus) == -1) { + return false; + } + } + } + + _busStorages.put(key, collection); + } + catch (IOException ex) { + ex.printStackTrace(); + return false; + } + + return true; + } } diff --git a/AccordionBus/DrawingDoorsTypeOne.java b/AccordionBus/DrawingDoorsTypeOne.java index 894733d..9bf5d6c 100644 --- a/AccordionBus/DrawingDoorsTypeOne.java +++ b/AccordionBus/DrawingDoorsTypeOne.java @@ -15,6 +15,14 @@ public class DrawingDoorsTypeOne implements IDrawingDoors { } } + public int getNumDoors() { + return switch (numDoors) { + case Three -> 3; + case Four -> 4; + case Five -> 5; + }; + } + public void DrawDoors(Graphics2D g2d, Color color, boolean isAdditionalBody, int _startPosX, int _startPosY) { int value = numDoors.getNumDoors(); if (value >= 3) { diff --git a/AccordionBus/DrawingDoorsTypeThree.java b/AccordionBus/DrawingDoorsTypeThree.java index e28610a..b812e2d 100644 --- a/AccordionBus/DrawingDoorsTypeThree.java +++ b/AccordionBus/DrawingDoorsTypeThree.java @@ -15,6 +15,14 @@ public class DrawingDoorsTypeThree implements IDrawingDoors { } } + public int getNumDoors() { + return switch (numDoors) { + case Three -> 3; + case Four -> 4; + case Five -> 5; + }; + } + public void DrawDoors(Graphics2D g2d, Color color, boolean isAdditionalBody, int _startPosX, int _startPosY) { int value = numDoors.getNumDoors(); if (value >= 3) { diff --git a/AccordionBus/DrawingDoorsTypeTwo.java b/AccordionBus/DrawingDoorsTypeTwo.java index c5a1ae8..4fec906 100644 --- a/AccordionBus/DrawingDoorsTypeTwo.java +++ b/AccordionBus/DrawingDoorsTypeTwo.java @@ -15,6 +15,14 @@ public class DrawingDoorsTypeTwo implements IDrawingDoors { } } + public int getNumDoors() { + return switch (numDoors) { + case Three -> 3; + case Four -> 4; + case Five -> 5; + }; + } + public void DrawDoors(Graphics2D g2d, Color color, boolean isAdditionalBody, int _startPosX, int _startPosY) { int value = numDoors.getNumDoors(); if (value >= 3) { diff --git a/AccordionBus/ExtensionDrawingBus.java b/AccordionBus/ExtensionDrawingBus.java new file mode 100644 index 0000000..5b37d11 --- /dev/null +++ b/AccordionBus/ExtensionDrawingBus.java @@ -0,0 +1,94 @@ +package AccordionBus; + +import java.awt.Color; + +// Расширение для класса EntityBus +public class ExtensionDrawingBus { + // Создание объекта из строки + public static DrawingBus CreateDrawingBus(String info, String separatorForObject, int width, int height) { + String[] strs = info.split(separatorForObject); + if (strs.length == 5) + { + String[] bodyColorValues = strs[2].split(","); + + DrawingBus drawingBus = new DrawingBus( + Integer.parseInt(strs[0]), + Integer.parseInt(strs[1]), + new Color( + Integer.parseInt(bodyColorValues[0].replaceAll("\\D", "")), + Integer.parseInt(bodyColorValues[1].replaceAll("\\D", "")), + Integer.parseInt(bodyColorValues[2].replaceAll("\\D", "")) + ), + width, height); + + try { + drawingBus.drawingDoors = (IDrawingDoors)Class.forName(strs[3]).getDeclaredConstructor().newInstance(); + drawingBus.drawingDoors.setNumDoors(Integer.parseInt(strs[4])); + } + catch (Exception ex) { + return null; + } + + return drawingBus; + } + + if (strs.length == 8) + { + String[] bodyColorValues = strs[2].split(","); + String[] additionalColorValues = strs[5].split(","); + + DrawingAccordionBus drawingAccordionBus = new DrawingAccordionBus( + Integer.parseInt(strs[0]), + Integer.parseInt(strs[1]), + new Color( + Integer.parseInt(bodyColorValues[0].replaceAll("\\D", "")), + Integer.parseInt(bodyColorValues[1].replaceAll("\\D", "")), + Integer.parseInt(bodyColorValues[2].replaceAll("\\D", "")) + ), + new Color( + Integer.parseInt(additionalColorValues[0].replaceAll("\\D", "")), + Integer.parseInt(additionalColorValues[1].replaceAll("\\D", "")), + Integer.parseInt(additionalColorValues[2].replaceAll("\\D", "")) + ), + Boolean.parseBoolean(strs[6]), + Boolean.parseBoolean(strs[7]), + width, height); + + try { + drawingAccordionBus.drawingDoors = (IDrawingDoors)Class.forName(strs[3]).getDeclaredConstructor().newInstance(); + drawingAccordionBus.drawingDoors.setNumDoors(Integer.parseInt(strs[4])); + } + catch (Exception ex) { + return null; + } + + return drawingAccordionBus; + } + + return null; + } + + // Получение данных для сохранения в файл + public static String GetDataForSave(DrawingBus drawingBus, String separatorForObject) { + EntityBus bus = drawingBus.EntityBus; + if (bus == null) + { + return null; + } + + String str = "" + bus.Speed + separatorForObject + + (int)bus.Weight + separatorForObject + + bus.BodyColor + separatorForObject + + drawingBus.drawingDoors.getClass().getName() + separatorForObject + + drawingBus.drawingDoors.getNumDoors(); + + if (!(bus instanceof EntityAccordionBus)) { + return str; + } + + return str + separatorForObject + + ((EntityAccordionBus)bus).getAdditionalColor() + separatorForObject + + ((EntityAccordionBus)bus).isAdditionalBody() + separatorForObject + + ((EntityAccordionBus)bus).isAdditionalDoor(); + } +} diff --git a/AccordionBus/IDrawingDoors.java b/AccordionBus/IDrawingDoors.java index 6ea94d9..d677a43 100644 --- a/AccordionBus/IDrawingDoors.java +++ b/AccordionBus/IDrawingDoors.java @@ -6,5 +6,7 @@ import java.awt.*; public interface IDrawingDoors { public void setNumDoors(int num); + public int getNumDoors(); + public void DrawDoors(Graphics2D g2d, Color additionalColor, boolean isAdditionalBody, int _startPosX, int _startPosY); } diff --git a/AccordionBus/SetGeneric.java b/AccordionBus/SetGeneric.java index 2d30a9c..53582dd 100644 --- a/AccordionBus/SetGeneric.java +++ b/AccordionBus/SetGeneric.java @@ -52,6 +52,11 @@ public class SetGeneric { return true; } + // Очистить список + public void Clear() { + _places.clear(); + } + // Получение объекта из набора по позиции public T Get(int position) { // Проверка позиции -- 2.25.1