diff --git a/laba1Loco/ExtentionDrawingTrain.java b/laba1Loco/ExtentionDrawingTrain.java index 83bfaba..9fa5936 100644 --- a/laba1Loco/ExtentionDrawingTrain.java +++ b/laba1Loco/ExtentionDrawingTrain.java @@ -1,6 +1,7 @@ package laba1Loco; import java.awt.Color; +import java.lang.reflect.InvocationTargetException; public class ExtentionDrawingTrain { /// @@ -14,23 +15,32 @@ public class ExtentionDrawingTrain { public static DrawingTrain CreateDrawingTrain(String info, String separatorForObject, int width, int height) { String[] strs = info.split(separatorForObject); - if (strs.length == 4) + if (strs.length == 5) { String[] colorValues = strs[2].split(","); - return new DrawingTrain(Integer.parseInt(strs[0]), (double)Integer.parseInt(strs[1]), + DrawingTrain drawingTrain = 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(colorValues[0].replaceAll("\\D", "")), + Integer.parseInt(colorValues[1].replaceAll("\\D", "")), + Integer.parseInt(colorValues[2].replaceAll("\\D", "")) ), - Integer.parseInt(strs[3]), width, height); + 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 == 8) + if (strs.length == 9) { String[] colorValues = strs[2].split(","); - String[] colorValues2 = strs[4].split(","); - return new DrawingLoco( + String[] colorValues2 = strs[5].split(","); + DrawingLoco drawingLoco = new DrawingLoco( Integer.parseInt(strs[0]), (double)Integer.parseInt(strs[1]), new Color( @@ -44,10 +54,18 @@ public class ExtentionDrawingTrain { Integer.parseInt(colorValues2[1].replaceAll("\\D", "")), Integer.parseInt(colorValues2[2].replaceAll("\\D", "")) ), - strs[5].equals("True"), - strs[6].equals("True"), - strs[7].equals("True"), + 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; } @@ -64,7 +82,7 @@ public class ExtentionDrawingTrain { { return null; } - String str = "" + train.Speed + separatorForObject + (int)train.Weight + separatorForObject + train.BodyColor + separatorForObject + train.numWheel; + 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; diff --git a/laba1Loco/FormTrainCollecltion.java b/laba1Loco/FormTrainCollecltion.java index 2c8350e..0e3fb34 100644 --- a/laba1Loco/FormTrainCollecltion.java +++ b/laba1Loco/FormTrainCollecltion.java @@ -270,7 +270,7 @@ public class FormTrainCollecltion { fileChooser.setDialogTitle("Выберите файл для загрузки данных"); if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) { File selectedFile = fileChooser.getSelectedFile(); - if (_storage.loadData(selectedFile.getAbsolutePath())) { + if (_storage.LoadData(selectedFile.getAbsolutePath())) { JOptionPane.showMessageDialog(null, "Загрузка прошла успешно", "Результат", JOptionPane.INFORMATION_MESSAGE); } else { JOptionPane.showMessageDialog(null, "Не загрузилось", "Результат", JOptionPane.ERROR_MESSAGE); @@ -300,10 +300,61 @@ public class FormTrainCollecltion { } } ); + 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); diff --git a/laba1Loco/TrainsGenericStorage.java b/laba1Loco/TrainsGenericStorage.java index b38d5a4..36442cf 100644 --- a/laba1Loco/TrainsGenericStorage.java +++ b/laba1Loco/TrainsGenericStorage.java @@ -6,6 +6,7 @@ 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.Collections; import java.util.HashMap; @@ -30,6 +31,73 @@ public class TrainsGenericStorage { 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 = 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; + } + + if (_trainStorages.containsKey(key)) + _trainStorages.remove(key); + _trainStorages.put(key, collection); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + + return true; + } + /// /// Сохранение информации по автомобилям в хранилище в файл /// @@ -68,7 +136,7 @@ public class TrainsGenericStorage { /// /// Путь и имя файла /// true - загрузка прошла успешно, false - ошибка призагрузке данных - public boolean loadData(String filename) { + public boolean LoadData(String filename) { if (!new File(filename).exists()) { return false; }