лаба 6 Кувшинов Тимур ПИбд-21 Сложная #8

Closed
TImourka wants to merge 4 commits from laba6 into laba5
5 changed files with 393 additions and 0 deletions

View File

@ -0,0 +1,92 @@
package laba1Loco;
import java.awt.Color;
import java.lang.reflect.InvocationTargetException;
public class ExtentionDrawingTrain {
/// <summary>
/// Создание объекта из строки
/// </summary>
/// <param name="info">Строка с данными для создания объекта</param>
/// <param name="separatorForObject">Разделитель даннных</param>
/// <param name="width">Ширина</param>
/// <param name="height">Высота</param>
/// <returns>Объект</returns>
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;
}
/// <summary>
/// Получение данных для сохранения в файл
/// </summary>
/// <param name="drawningtrain">Сохраняемый объект</param>
/// <param name="separatorForObject">Разделитель даннных</param>
/// <returns>Строка с данными по объекту</returns>
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;
}
}

View File

@ -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);
}
}

View File

@ -118,4 +118,6 @@ public class SetGeneric<T extends Object> {
}
};
}
public void clear(){ _places.clear(); }
}

View File

@ -5,6 +5,10 @@ import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
public class TrainsGenericCollection<T extends DrawingTrain, U extends IMoveableObject>{
/// <summary>
/// Получение объектов коллекции
/// </summary>
public Iterable<T> getTrains(final Integer maxTrains) { return _collection.GetTrains(maxTrains); }
/// <summary>
/// Ширина окна прорисовки
/// </summary>
@ -128,4 +132,5 @@ public class TrainsGenericCollection<T extends DrawingTrain, U extends IMoveable
i++;
}
}
public void clear(){ _collection.clear(); }
}

View File

@ -1,10 +1,184 @@
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.ArrayList;
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 {
/// <summary>
/// Разделитель для записи ключа и значения элемента словаря
/// </summary>
private static String _separatorForKeyValueWR = "|";
private static String _separatorForKeyValue = "\\|";
/// <summary>
/// Разделитель для записей коллекции данных в файл
/// </summary>
private String _separatorRecordsWR = ";";
private String _separatorRecords = "\\;";
/// <summary>
/// Разделитель для записи информации по объекту в файл
/// </summary>
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))
Review

Нет проверки, что get вернул не null значение

Нет проверки, что get вернул не null значение
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<DrawingTrain, DrawningObjectTrain> collection;
if (_trainStorages.containsKey(key)){
collection = _trainStorages.get(key);
collection.clear();
}
else
collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight);
List<String> trainsStrings = new ArrayList<String>();
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;
}
/// <summary>
/// Сохранение информации по поездам в хранилище в файл
/// </summary>
/// <param name="filename">Путь и имя файла</param>
/// <returns>true - сохранение прошло успешно, false - ошибка при cохранении данных</returns>
public boolean SaveData(String filename)
{
if (new File(filename).exists()) {
new File(filename).delete();
}
StringBuilder data = new StringBuilder();
for (Map.Entry<String, TrainsGenericCollection<DrawingTrain, DrawningObjectTrain>> 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;
}
/// <summary>
/// Загрузка информации по поездам в хранилище из файла
/// </summary>
/// <param name="filename">Путь и имя файла</param>
/// <returns>true - загрузка прошла успешно, false - ошибка призагрузке данных</returns>
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<DrawingTrain, DrawningObjectTrain> collection = new TrainsGenericCollection<>(_pictureWidth, _pictureHeight);
String[] set = record[1].split(_separatorRecords);
List<String> 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;
}
/// <summary>
/// Словарь (хранилище)
/// </summary>