LabWork06: Лабораторная готова, возможен рефакторинг
This commit is contained in:
parent
5a2ef44c5c
commit
47e81cce43
@ -18,6 +18,10 @@ public class DrawningCrossRollers implements IDrawningRollers{
|
||||
this.colorRollers = colorRollers;
|
||||
}
|
||||
|
||||
public int getRollersCount() {
|
||||
return rollersCount.getValue();
|
||||
}
|
||||
|
||||
public void DrawRollers(Graphics2D g, float _startPosX, float _startPosY){
|
||||
Color penColor = Color.BLACK;
|
||||
Color mainColor = colorRollers==null ? Color.LIGHT_GRAY : colorRollers;
|
||||
|
@ -39,4 +39,16 @@ public class DrawningObjectExcavator implements IDrawningObject{
|
||||
public void drawningObject(Graphics2D g) {
|
||||
_tracktor.DrawTransport(g);
|
||||
}
|
||||
|
||||
public String getInfo() {
|
||||
if (_tracktor == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return TracktorSerde.serialize(_tracktor);
|
||||
}
|
||||
|
||||
public static IDrawningObject create(String data) {
|
||||
return new DrawningObjectExcavator(TracktorSerde.deserialize(data));
|
||||
}
|
||||
}
|
||||
|
@ -18,6 +18,10 @@ public class DrawningRollers implements IDrawningRollers {
|
||||
this.colorRollers = colorRollers;
|
||||
}
|
||||
|
||||
public int getRollersCount() {
|
||||
return rollersCount.getValue();
|
||||
}
|
||||
|
||||
public void DrawRollers(Graphics2D g, float _startPosX, float _startPosY){
|
||||
Color penColor = Color.BLACK;
|
||||
Color mainColor = colorRollers==null ? Color.LIGHT_GRAY : colorRollers;
|
||||
|
@ -18,6 +18,10 @@ public class DrawningSquaredRollers implements IDrawningRollers {
|
||||
this.colorRollers = colorRollers;
|
||||
}
|
||||
|
||||
public int getRollersCount() {
|
||||
return rollersCount.getValue();
|
||||
}
|
||||
|
||||
public void DrawRollers(Graphics2D g, float _startPosX, float _startPosY){
|
||||
Color penColor = Color.BLACK;
|
||||
Color mainColor = colorRollers==null ? Color.LIGHT_GRAY : colorRollers;
|
||||
|
@ -1,13 +1,16 @@
|
||||
import javax.swing.*;
|
||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
import javax.swing.text.DefaultFormatterFactory;
|
||||
import javax.swing.text.MaskFormatter;
|
||||
import java.awt.*;
|
||||
import java.io.IOException;
|
||||
import java.text.ParseException;
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Optional;
|
||||
|
||||
public class FormMapWithSetTracktor extends JFrame {
|
||||
private JMenuBar menuBar;
|
||||
private JPanel ContentPanel;
|
||||
private JPanel pictureBox;
|
||||
private JPanel toolsGroup;
|
||||
@ -51,6 +54,88 @@ public class FormMapWithSetTracktor extends JFrame {
|
||||
}
|
||||
|
||||
_mapsCollection = new MapsCollection(pictureBox.getWidth(), pictureBox.getHeight());
|
||||
|
||||
menuBar = new JMenuBar();
|
||||
|
||||
JMenu fileMenu = new JMenu("Файл");
|
||||
menuBar.add(fileMenu);
|
||||
|
||||
JMenuItem saveMenuItem = new JMenuItem("Сохранить");
|
||||
saveMenuItem.addActionListener(e -> {
|
||||
JFileChooser dialog = new JFileChooser();
|
||||
dialog.setFileFilter(new FileNameExtensionFilter("TXT file", "txt"));
|
||||
dialog.showSaveDialog(this);
|
||||
|
||||
try {
|
||||
if (_mapsCollection.saveData(dialog.getSelectedFile().getAbsolutePath())) {
|
||||
JOptionPane.showMessageDialog(this, "Сохранение прошло успешно", "Успех", JOptionPane.INFORMATION_MESSAGE);
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(this, "Не сохранилось", "Провал", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
});
|
||||
fileMenu.add(saveMenuItem);
|
||||
|
||||
JMenuItem loadMenuItem = new JMenuItem("Загрузить");
|
||||
loadMenuItem.addActionListener(e -> {
|
||||
JFileChooser dialog = new JFileChooser();
|
||||
dialog.setFileFilter(new FileNameExtensionFilter("TXT file", "txt"));
|
||||
dialog.showOpenDialog(this);
|
||||
|
||||
try {
|
||||
if (_mapsCollection.loadData(dialog.getSelectedFile().getAbsolutePath())) {
|
||||
reloadMaps();
|
||||
JOptionPane.showMessageDialog(this, "Загрузка прошла успешно", "Успех", JOptionPane.INFORMATION_MESSAGE);
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(this, "Не загрузилось", "Провал", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
});
|
||||
fileMenu.add(loadMenuItem);
|
||||
|
||||
JMenuItem saveMapMenuItem = new JMenuItem("Сохранить карту");
|
||||
saveMapMenuItem.addActionListener(e -> {
|
||||
JFileChooser dialog = new JFileChooser();
|
||||
dialog.setFileFilter(new FileNameExtensionFilter("TXT file", "txt"));
|
||||
dialog.showSaveDialog(this);
|
||||
|
||||
try {
|
||||
if (_mapsCollection.saveMap(Optional.ofNullable(listBoxMaps.getSelectedValue()).orElse(""), dialog.getSelectedFile().getAbsolutePath())) {
|
||||
JOptionPane.showMessageDialog(this, "Сохранение прошло успешно", "Успех", JOptionPane.INFORMATION_MESSAGE);
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(this, "Не сохранилось", "Провал", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
});
|
||||
fileMenu.add(saveMapMenuItem);
|
||||
|
||||
JMenuItem loadMapMenuItem = new JMenuItem("Загрузить карту");
|
||||
loadMapMenuItem.addActionListener(e -> {
|
||||
JFileChooser dialog = new JFileChooser();
|
||||
dialog.setFileFilter(new FileNameExtensionFilter("TXT file", "txt"));
|
||||
dialog.showOpenDialog(this);
|
||||
|
||||
try {
|
||||
if (_mapsCollection.loadMap(dialog.getSelectedFile().getAbsolutePath())) {
|
||||
reloadMaps();
|
||||
JOptionPane.showMessageDialog(this, "Загрузка прошла успешно", "Успех", JOptionPane.INFORMATION_MESSAGE);
|
||||
} else {
|
||||
JOptionPane.showMessageDialog(this, "Не загрузилось", "Провал", JOptionPane.INFORMATION_MESSAGE);
|
||||
}
|
||||
} catch (IOException ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
});
|
||||
fileMenu.add(loadMapMenuItem);
|
||||
|
||||
setJMenuBar(menuBar);
|
||||
|
||||
comboBoxMapSelector.removeAllItems();
|
||||
for (var key : _mapsDict.keySet()) {
|
||||
comboBoxMapSelector.addItem(key);
|
||||
@ -87,7 +172,6 @@ public class FormMapWithSetTracktor extends JFrame {
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
buttonAddTracktor.addActionListener(e -> {
|
||||
FormTracktorConfig form = new FormTracktorConfig();
|
||||
form.addListener(tracktor -> {
|
||||
|
@ -6,4 +6,5 @@ public interface IDrawningObject {
|
||||
void moveObject(Direction direction);
|
||||
void drawningObject(Graphics2D g);
|
||||
float[] getCurrentPosition();
|
||||
String getInfo();
|
||||
}
|
||||
|
@ -4,4 +4,5 @@ public interface IDrawningRollers {
|
||||
void setRollersCount(int count);
|
||||
void setColor(Color color);
|
||||
void DrawRollers(Graphics2D g, float _startPosX, float _startPosY);
|
||||
int getRollersCount();
|
||||
}
|
||||
|
@ -19,6 +19,10 @@ public class MapWithSetTracktorGeneric <T extends IDrawningObject, U extends Abs
|
||||
_map = map;
|
||||
}
|
||||
|
||||
public U getMap() {
|
||||
return _map;
|
||||
}
|
||||
|
||||
public int addTracktor(T tracktor) {
|
||||
return _setTracktor.insert(tracktor);
|
||||
}
|
||||
@ -160,4 +164,21 @@ public class MapWithSetTracktorGeneric <T extends IDrawningObject, U extends Abs
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public String getData(char separatorType, char separatorData) {
|
||||
StringBuilder data = new StringBuilder(String.format("%s%c", _map.getClass().getSimpleName(), separatorType));
|
||||
|
||||
for (var tracktor : _setTracktor.getTracktors()) {
|
||||
data.append(String.format("%s%c", tracktor.getInfo(), separatorData));
|
||||
}
|
||||
|
||||
return data.toString();
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public void loadData(String[] records) {
|
||||
for (int i = records.length - 1; i >= 0; i--) {
|
||||
_setTracktor.insert((T) DrawningObjectExcavator.create(records[i]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,12 +1,16 @@
|
||||
import java.io.*;
|
||||
import java.util.HashMap;
|
||||
import java.util.Set;
|
||||
|
||||
public class MapsCollection {
|
||||
private final HashMap<String, MapWithSetTracktorGeneric<DrawningObjectExcavator, AbstractMap>> _mapsStorage;
|
||||
private final HashMap<String, MapWithSetTracktorGeneric<IDrawningObject, AbstractMap>> _mapsStorage;
|
||||
|
||||
private final int _pictureWidth;
|
||||
private final int _pictureHeight;
|
||||
|
||||
private final char separatorDict = '|';
|
||||
private final char separatorData = ';';
|
||||
|
||||
public Set<String> getKeys() {
|
||||
return _mapsStorage.keySet();
|
||||
}
|
||||
@ -27,7 +31,130 @@ public class MapsCollection {
|
||||
_mapsStorage.remove(name);
|
||||
}
|
||||
|
||||
public MapWithSetTracktorGeneric<DrawningObjectExcavator, AbstractMap> getMap(String name) {
|
||||
public MapWithSetTracktorGeneric<IDrawningObject, AbstractMap> getMap(String name) {
|
||||
return _mapsStorage.getOrDefault(name, null);
|
||||
}
|
||||
|
||||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
||||
public boolean saveData(String filename) throws IOException {
|
||||
File file = new File(filename);
|
||||
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
}
|
||||
|
||||
file.createNewFile();
|
||||
|
||||
try (PrintWriter writer = new PrintWriter(file)) {
|
||||
writer.println("MapsCollection");
|
||||
|
||||
for (var storage : _mapsStorage.entrySet()) {
|
||||
writer.println(String.format("%s%c%s", storage.getKey(), separatorDict, storage.getValue().getData(separatorDict, separatorData)));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean loadData(String filename) throws IOException {
|
||||
File file = new File(filename);
|
||||
|
||||
if (!file.exists()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
|
||||
String currentLine = reader.readLine();
|
||||
|
||||
if (currentLine == null || !currentLine.contains("MapsCollection")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
_mapsStorage.clear();
|
||||
while ((currentLine = reader.readLine()) != null) {
|
||||
var elements = currentLine.split(String.format("\\%c", separatorDict));
|
||||
|
||||
AbstractMap map = switch (elements[1]) {
|
||||
case "SimpleMap" -> new SimpleMap();
|
||||
case "DumpMap" -> new DumpMap();
|
||||
default -> null;
|
||||
};
|
||||
|
||||
_mapsStorage.put(elements[0], new MapWithSetTracktorGeneric<>(_pictureWidth, _pictureHeight, map));
|
||||
_mapsStorage.get(elements[0]).loadData(elements[2].split(separatorData + "\n?"));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@SuppressWarnings("ResultOfMethodCallIgnored")
|
||||
public boolean saveMap(String mapName, String filename) throws IOException {
|
||||
File file = new File(filename);
|
||||
|
||||
if (file.exists()) {
|
||||
file.delete();
|
||||
}
|
||||
|
||||
file.createNewFile();
|
||||
|
||||
MapWithSetTracktorGeneric<IDrawningObject, AbstractMap> map = _mapsStorage.getOrDefault(mapName, null);
|
||||
|
||||
if (map == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try (PrintWriter writer = new PrintWriter(file)) {
|
||||
writer.println("Map");
|
||||
writer.println(mapName);
|
||||
writer.println(map.getMap().getClass().getSimpleName());
|
||||
|
||||
for (var tracktor : map._setTracktor.getTracktors()) {
|
||||
writer.println(tracktor.getInfo());
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public boolean loadMap(String filename) throws IOException {
|
||||
File file = new File(filename);
|
||||
|
||||
if (!file.exists()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try (BufferedReader reader = new BufferedReader(new FileReader(file))) {
|
||||
String currentLine = reader.readLine();
|
||||
|
||||
if (currentLine == null || !currentLine.contains("Map")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
String mapName = reader.readLine();
|
||||
|
||||
MapWithSetTracktorGeneric<IDrawningObject, AbstractMap> map;
|
||||
if (_mapsStorage.containsKey(mapName)) {
|
||||
map = _mapsStorage.get(mapName);
|
||||
if (!map.getMap().getClass().getSimpleName().equals(reader.readLine())) {
|
||||
return false;
|
||||
}
|
||||
map._setTracktor.clear();
|
||||
} else {
|
||||
map = switch (reader.readLine()) {
|
||||
case "SimpleMap" -> new MapWithSetTracktorGeneric<>(_pictureWidth, _pictureHeight, new SimpleMap());
|
||||
case "DumpMap" -> new MapWithSetTracktorGeneric<>(_pictureWidth, _pictureHeight, new DumpMap());
|
||||
default -> null;
|
||||
};
|
||||
}
|
||||
|
||||
while ((currentLine = reader.readLine()) != null) {
|
||||
map._setTracktor.insert(DrawningObjectExcavator.create(currentLine));
|
||||
}
|
||||
|
||||
_mapsStorage.put(mapName, map);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,18 @@
|
||||
public enum RollersCount {
|
||||
Four,
|
||||
Five,
|
||||
Six
|
||||
Six;
|
||||
|
||||
public int getValue() {
|
||||
return switch (this) {
|
||||
case Four -> 4;
|
||||
case Five -> 5;
|
||||
case Six -> 6;
|
||||
};
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return Integer.toString(getValue());
|
||||
}
|
||||
}
|
||||
|
@ -49,4 +49,8 @@ public class SetTracktorGeneric<T> {
|
||||
{
|
||||
return _places;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
_places.clear();
|
||||
}
|
||||
}
|
||||
|
69
TracktorSerde.java
Normal file
69
TracktorSerde.java
Normal file
@ -0,0 +1,69 @@
|
||||
import java.awt.*;
|
||||
|
||||
public class TracktorSerde { // Tracktor Serialization/Deserialization
|
||||
private static final char _separatorForObject = ':';
|
||||
|
||||
public static DrawningTracktor deserialize(String info) {
|
||||
String[] strings = info.split(Character.toString(_separatorForObject));
|
||||
|
||||
int speed = Integer.parseInt(strings[0]);
|
||||
float weight = Float.parseFloat(strings[1]);
|
||||
Color bodyColor = new Color(Integer.parseInt(strings[2]));
|
||||
IDrawningRollers rollers = switch (strings[3]) {
|
||||
case "DrawningRollers" -> new DrawningRollers(Integer.parseInt(strings[4]), bodyColor);
|
||||
case "DrawningCrossRollers" -> new DrawningCrossRollers(Integer.parseInt(strings[4]), bodyColor);
|
||||
case "DrawningSquaredRollers" -> new DrawningSquaredRollers(Integer.parseInt(strings[4]), bodyColor);
|
||||
default -> null;
|
||||
};
|
||||
|
||||
if (strings.length == 5) {
|
||||
EntityTracktor entity = new EntityTracktor(speed, weight, bodyColor);
|
||||
|
||||
return new DrawningTracktor(entity, rollers);
|
||||
}
|
||||
|
||||
if (strings.length == 8) {
|
||||
Color dopColor = new Color(Integer.parseInt(strings[5]));
|
||||
boolean bucket = Boolean.parseBoolean(strings[6]);
|
||||
boolean supports = Boolean.parseBoolean(strings[7]);
|
||||
|
||||
EntityTrackedVehicle entity = new EntityTrackedVehicle(speed, weight, bodyColor, dopColor, bucket, supports);
|
||||
|
||||
return new DrawningTrackedVehicle(entity, rollers);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static String serialize(DrawningTracktor drawingTracktor) {
|
||||
EntityTracktor tracktor = drawingTracktor.getTracktor();
|
||||
|
||||
String result = String.format(
|
||||
"%d%c%s%c%d%c%s%c%d",
|
||||
tracktor.getSpeed(),
|
||||
_separatorForObject,
|
||||
tracktor.getWeight(),
|
||||
_separatorForObject,
|
||||
tracktor.getBodyColor().getRGB(),
|
||||
_separatorForObject,
|
||||
drawingTracktor.getRollers().getClass().getSimpleName(),
|
||||
_separatorForObject,
|
||||
drawingTracktor.getRollers().getRollersCount()
|
||||
);
|
||||
|
||||
if (!(tracktor instanceof EntityTrackedVehicle trackedVehicle)) {
|
||||
return result;
|
||||
}
|
||||
|
||||
return String.format(
|
||||
"%s%c%d%c%b%c%b",
|
||||
result,
|
||||
_separatorForObject,
|
||||
trackedVehicle.getDopColor().getRGB(),
|
||||
_separatorForObject,
|
||||
trackedVehicle.getBucket(),
|
||||
_separatorForObject,
|
||||
trackedVehicle.getSupports()
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user