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;
+ }
///
/// Словарь (хранилище)
///