diff --git a/laba1Loco/ExtentionDrawingTrain.java b/laba1Loco/ExtentionDrawingTrain.java new file mode 100644 index 0000000..9fa5936 --- /dev/null +++ b/laba1Loco/ExtentionDrawingTrain.java @@ -0,0 +1,92 @@ +package laba1Loco; + +import java.awt.Color; +import java.lang.reflect.InvocationTargetException; + +public class ExtentionDrawingTrain { + /// + /// Создание объекта из строки + /// + /// Строка с данными для создания объекта + /// Разделитель даннных + /// Ширина + /// Высота + /// Объект + public static DrawingTrain CreateDrawingTrain(String info, String separatorForObject, int width, int height) + { + String[] strs = info.split(separatorForObject); + if (strs.length == 5) + { + String[] colorValues = strs[2].split(","); + + DrawingTrain drawingTrain = new DrawingTrain(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{ + drawingTrain.wheelDrawing = (IWheelDrawing)Class.forName(strs[4]).getDeclaredConstructor().newInstance(); + drawingTrain.wheelDrawing.setNumWheel(drawingTrain.EntityTrain.numWheel); + } + catch(Exception e){ + return null; + } + return drawingTrain; + } + if (strs.length == 9) + { + String[] colorValues = strs[2].split(","); + String[] colorValues2 = strs[5].split(","); + DrawingLoco drawingLoco = 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[6].equals("true"), + strs[7].equals("true"), + strs[8].equals("true"), + width, height); + try{ + drawingLoco.wheelDrawing = (IWheelDrawing)Class.forName(strs[4]).getDeclaredConstructor().newInstance(); + drawingLoco.wheelDrawing.setNumWheel(drawingLoco.EntityTrain.numWheel); + } + catch(Exception e){ + return null; + } + return drawingLoco; + } + 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 + separatorForObject + drawningTrain.wheelDrawing.getClass().getName(); + 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..0e3fb34 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,116 @@ 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); + } + } + } + ); + JMenuItem openItemSingle = new JMenuItem("Open single"); + openItemSingle.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.LoadDataSingle(selectedFile.getAbsolutePath())) { + JOptionPane.showMessageDialog(null, "Загрузка прошла успешно", "Результат", JOptionPane.INFORMATION_MESSAGE); + } else { + JOptionPane.showMessageDialog(null, "Не загрузилось", "Результат", JOptionPane.ERROR_MESSAGE); + } + } + ReloadObjects(); + } + } + ); + JMenuItem saveItemSingle = new JMenuItem("Save single"); + 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); + w.setSize (1000, 600); w.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); w.setLayout(null); @@ -260,6 +376,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 +392,8 @@ public class FormTrainCollecltion { w.add(buttonGetRemoved); + w.add(menuBar); + w.setVisible(true); } } diff --git a/laba1Loco/SetGeneric.java b/laba1Loco/SetGeneric.java index d592135..05e83ee 100644 --- a/laba1Loco/SetGeneric.java +++ b/laba1Loco/SetGeneric.java @@ -118,4 +118,6 @@ public class SetGeneric { } }; } + + public void clear(){ _places.clear(); } } diff --git a/laba1Loco/TrainsGenericCollection.java b/laba1Loco/TrainsGenericCollection.java index 5063084..2b8a382 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); } /// /// Ширина окна прорисовки /// @@ -128,4 +132,5 @@ public class TrainsGenericCollection + /// Разделитель для записи ключа и значения элемента словаря + /// + 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 (DrawingTrain elem : _trainStorages.get(key).getTrains(100)) + data.append(elem != null ? ExtentionDrawingTrain.GetDataForSave(elem, _separatorForObjectWR) + "\n" : ""); + + if (data.length() == 0) + return false; + + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filename))) { + writer.write("TrainStorageSingle" + System.lineSeparator() + data.toString()); + } catch (IOException 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("TrainStorageSingle")) + return false; + + String key = reader.readLine(); + if (key == null || key.length() == 0) + return false; + + TrainsGenericCollection collection; + if (_trainStorages.containsKey(key)){ + collection = _trainStorages.get(key); + collection.clear(); + } + else + collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight); + + List trainsStrings = new ArrayList(); + + s = reader.readLine(); + while (s != null && s.length() != 0){ + trainsStrings.add(s); + s = reader.readLine(); + } + + Collections.reverse(trainsStrings); + for (String elem : trainsStrings) { + DrawingTrain train = ExtentionDrawingTrain.CreateDrawingTrain(elem, _separatorForObject, _pictureWidth, _pictureHeight); + if (train == null || collection.Add(train) == -1) + return false; + } + + _trainStorages.put(key, collection); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + + return true; + } + + /// + /// Сохранение информации по поездам в хранилище в файл + /// + /// Путь и имя файла + /// 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; + } /// /// Словарь (хранилище) ///