From 6a39119b8df2cbe04b2f0b0ab5c29aa4927bda86 Mon Sep 17 00:00:00 2001 From: Timourka Date: Sun, 19 Nov 2023 21:36:49 +0400 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=95=D0=9D=D0=A8=D0=A2=D0=90=D0=91=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B6=D0=B0=D0=B1=D0=B5=20=D0=BB=D0=B0=D0=B1?= =?UTF-8?q?=D0=B0=20=206?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- laba1Loco/ExtentionDrawingTrain.java | 74 ++++++++++++++++++ laba1Loco/FormTrainCollecltion.java | 69 +++++++++++++++++ laba1Loco/TrainsGenericCollection.java | 4 + laba1Loco/TrainsGenericStorage.java | 101 +++++++++++++++++++++++++ 4 files changed, 248 insertions(+) create mode 100644 laba1Loco/ExtentionDrawingTrain.java diff --git a/laba1Loco/ExtentionDrawingTrain.java b/laba1Loco/ExtentionDrawingTrain.java new file mode 100644 index 0000000..83bfaba --- /dev/null +++ b/laba1Loco/ExtentionDrawingTrain.java @@ -0,0 +1,74 @@ +package laba1Loco; + +import java.awt.Color; + +public class ExtentionDrawingTrain { + /// + /// Создание объекта из строки + /// + /// Строка с данными для создания объекта + /// Разделитель даннных + /// Ширина + /// Высота + /// Объект + public static DrawingTrain CreateDrawingTrain(String info, String separatorForObject, int width, int height) + { + String[] strs = info.split(separatorForObject); + if (strs.length == 4) + { + String[] colorValues = strs[2].split(","); + + return new DrawingTrain(Integer.parseInt(strs[0]), (double)Integer.parseInt(strs[1]), + new Color( + Integer.parseInt(colorValues[0]), + Integer.parseInt(colorValues[1]), + Integer.parseInt(colorValues[2]) + ), + Integer.parseInt(strs[3]), width, height); + } + if (strs.length == 8) + { + String[] colorValues = strs[2].split(","); + String[] colorValues2 = strs[4].split(","); + return new DrawingLoco( + 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]), + new Color( + Integer.parseInt(colorValues2[0].replaceAll("\\D", "")), + Integer.parseInt(colorValues2[1].replaceAll("\\D", "")), + Integer.parseInt(colorValues2[2].replaceAll("\\D", "")) + ), + strs[5].equals("True"), + strs[6].equals("True"), + strs[7].equals("True"), + width, height); + } + return null; + } + /// + /// Получение данных для сохранения в файл + /// + /// Сохраняемый объект + /// Разделитель даннных + /// Строка с данными по объекту + public static String GetDataForSave(DrawingTrain drawningTrain, String separatorForObject) + { + EntityTrain train = drawningTrain.EntityTrain; + if (train == null) + { + return null; + } + String str = "" + train.Speed + separatorForObject + (int)train.Weight + separatorForObject + train.BodyColor + separatorForObject + train.numWheel; + if (!(train instanceof EntityLoco)) + { + return str; + } + return str+separatorForObject+((EntityLoco)train).AdditionalColor.toString()+separatorForObject+((EntityLoco)train).Tube+separatorForObject+((EntityLoco)train).FuelTank+separatorForObject+((EntityLoco)train).LocoLine; + } +} diff --git a/laba1Loco/FormTrainCollecltion.java b/laba1Loco/FormTrainCollecltion.java index a134a55..2c8350e 100644 --- a/laba1Loco/FormTrainCollecltion.java +++ b/laba1Loco/FormTrainCollecltion.java @@ -4,18 +4,24 @@ import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; import java.util.LinkedList; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JComponent; +import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JList; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JTextField; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import javax.swing.filechooser.FileNameExtensionFilter; public class FormTrainCollecltion { private class Canvas extends JComponent{ @@ -243,6 +249,65 @@ public class FormTrainCollecltion { } ); + // Создаем панель меню + JMenuBar menuBar = new JMenuBar(); + + // Создаем меню + JMenu fileMenu = new JMenu("File"); + + // Создаем пункты меню + JMenuItem openItem = new JMenuItem("Open"); + 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("Save"); + saveItem.addActionListener( + new ActionListener() { + 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); + } + } + } + ); + + // Добавляем пункты в меню + fileMenu.add(openItem); + fileMenu.add(saveItem); + + // Добавляем меню в панель меню + menuBar.add(fileMenu); + w.setSize (1000, 600); w.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); w.setLayout(null); @@ -260,6 +325,8 @@ public class FormTrainCollecltion { buttonGetRemoved.setBounds(pictureBoxWidth, 330, 160, 20); + menuBar.setBounds(pictureBoxWidth, 360, 160, 20); + w.add(canv); w.add(ButtonAddTrain); w.add(ButtonRemoveTrain); @@ -274,6 +341,8 @@ public class FormTrainCollecltion { w.add(buttonGetRemoved); + w.add(menuBar); + w.setVisible(true); } } diff --git a/laba1Loco/TrainsGenericCollection.java b/laba1Loco/TrainsGenericCollection.java index 5063084..bdded48 100644 --- a/laba1Loco/TrainsGenericCollection.java +++ b/laba1Loco/TrainsGenericCollection.java @@ -5,6 +5,10 @@ import java.awt.Graphics2D; import java.awt.image.BufferedImage; public class TrainsGenericCollection{ + /// + /// Получение объектов коллекции + /// + public Iterable getTrains(final Integer maxTrains) { return _collection.GetTrains(maxTrains); } /// /// Ширина окна прорисовки /// diff --git a/laba1Loco/TrainsGenericStorage.java b/laba1Loco/TrainsGenericStorage.java index 114a486..b38d5a4 100644 --- a/laba1Loco/TrainsGenericStorage.java +++ b/laba1Loco/TrainsGenericStorage.java @@ -1,10 +1,111 @@ package laba1Loco; +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.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class TrainsGenericStorage { + /// + /// Разделитель для записи ключа и значения элемента словаря + /// + private static String _separatorForKeyValueWR = "|"; + private static String _separatorForKeyValue = "\\|"; + /// + /// Разделитель для записей коллекции данных в файл + /// + private String _separatorRecordsWR = ";"; + private String _separatorRecords = "\\;"; + /// + /// Разделитель для записи информации по объекту в файл + /// + private static String _separatorForObjectWR = ":"; + private static String _separatorForObject = "\\:"; + + /// + /// Сохранение информации по автомобилям в хранилище в файл + /// + /// Путь и имя файла + /// true - сохранение прошло успешно, false - ошибка при cохранении данных + public boolean SaveData(String filename) + { + if (new File(filename).exists()) { + new File(filename).delete(); + } + + StringBuilder data = new StringBuilder(); + + for (Map.Entry> record : _trainStorages.entrySet()) { + StringBuilder records = new StringBuilder(); + for (DrawingTrain elem : record.getValue().getTrains(100)) { + records.append(elem != null ? ExtentionDrawingTrain.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("TrainStorage" + System.lineSeparator() + data.toString()); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + + return true; + } + /// + /// Загрузка информации по автомобилям в хранилище из файла + /// + /// Путь и имя файла + /// true - загрузка прошла успешно, false - ошибка призагрузке данных + 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("TrainStorage")) + return false; + + _trainStorages.clear(); + s = reader.readLine(); + while (s != null && s.length() != 0) { + String[] record = s.split(_separatorForKeyValue); + s = reader.readLine(); + if (record.length != 2) { + continue; + } + TrainsGenericCollection collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight); + String[] set = record[1].split(_separatorRecords); + List reversedSet = Arrays.asList(set); + Collections.reverse(reversedSet); + for (String elem : reversedSet) { + DrawingTrain train = ExtentionDrawingTrain.CreateDrawingTrain(elem, _separatorForObject, _pictureWidth, _pictureHeight); + if (train == null || collection.Add(train) == -1) + return false; + } + _trainStorages.put(record[0], collection); + } + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return true; + } /// /// Словарь (хранилище) ///