From a41aa8393433a48d5ceee9c0f8561efe2250c226 Mon Sep 17 00:00:00 2001 From: Yunusov_Niyaz Date: Thu, 23 Nov 2023 22:51:24 +0400 Subject: [PATCH] Lab4 --- src/BusesGenericCollection.java | 7 +- src/BusesGenericStorage.java | 42 ++++++++++ src/FrameBusCollection.java | 135 ++++++++++++++++++++++++++++---- src/FrameTrolleybus.java | 12 ++- src/Main.java | 2 +- src/SetGeneric.java | 45 ++++++----- src/TrashCollection.java | 22 ++++++ 7 files changed, 225 insertions(+), 40 deletions(-) create mode 100644 src/BusesGenericStorage.java create mode 100644 src/TrashCollection.java diff --git a/src/BusesGenericCollection.java b/src/BusesGenericCollection.java index e6d8793..4b9a235 100644 --- a/src/BusesGenericCollection.java +++ b/src/BusesGenericCollection.java @@ -10,7 +10,7 @@ public class BusesGenericCollection(width * height, (Class) DrawingBus.class); + _collection = new SetGeneric(width * height); } public void showBuses(Graphics2D g){ drawBackground(g); @@ -34,6 +34,11 @@ public class BusesGenericCollection= _collection.getCount()) + return null; + return _collection.Get(position); + } private void drawBackground(Graphics2D g) { BasicStroke pen = new BasicStroke(3); g.setStroke(pen); diff --git a/src/BusesGenericStorage.java b/src/BusesGenericStorage.java new file mode 100644 index 0000000..6592011 --- /dev/null +++ b/src/BusesGenericStorage.java @@ -0,0 +1,42 @@ +import java.util.Dictionary; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; +public class BusesGenericStorage { + final HashMap> _busStorages; + public List Keys(){ + if(_busStorages == null) + return null; + return _busStorages.keySet().stream().collect(Collectors.toList()); + } + private final int _pictureWidth; + private final int _pictureHeight; + + public BusesGenericStorage(int pictureWidth, int pictureHeight){ + _busStorages = new HashMap<>(); + _pictureWidth = pictureWidth; + _pictureHeight = pictureHeight; + } + + public void addSet(String name){ + if(_busStorages.containsKey(name)) + return; + _busStorages.put(name, new BusesGenericCollection<>(_pictureWidth, _pictureHeight)); + } + + public void delSet(String name){ + if(!_busStorages.containsKey(name)) + return; + _busStorages.remove(name); + } + + public BusesGenericCollection getCollection(String name){ + if(!_busStorages.containsKey(name)) + return null; + return _busStorages.get(name); + } + + public DrawingBus Get(String collectionName, int position){ + return _busStorages.get(collectionName).Get(position); + } +} diff --git a/src/FrameBusCollection.java b/src/FrameBusCollection.java index df40ecb..9b3f96a 100644 --- a/src/FrameBusCollection.java +++ b/src/FrameBusCollection.java @@ -1,17 +1,28 @@ import javax.swing.*; +import javax.swing.border.StrokeBorder; import java.awt.*; import java.io.IOException; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.text.Normalizer; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; public class FrameBusCollection extends JFrame { - private BusesGenericCollection buses; + private BusesGenericStorage storage; + private JList listBoxStorages; + private DefaultListModel listBoxModel; + TrashCollection trashCollection = new TrashCollection<>(); JComponent pictureBoxCollection; TextField textFieldNumber; + TextField textFieldStorageName; public FrameBusCollection(){ super("Набор автобусов"); - setSize(new Dimension(900,500)); + setSize(new Dimension(1000,500)); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); createGui(); - buses = new BusesGenericCollection<>(pictureBoxCollection.getWidth(),pictureBoxCollection.getHeight()); + storage = new BusesGenericStorage(pictureBoxCollection.getWidth(),pictureBoxCollection.getHeight()); setVisible(true); } private void createGui(){ @@ -19,43 +30,83 @@ public class FrameBusCollection extends JFrame { public void paintComponent(Graphics graphics){ super.paintComponent(graphics); Graphics2D graphics2D = (Graphics2D) graphics; - if (buses != null) buses.showBuses(graphics2D); + if (listBoxStorages == null || storage == null) + return; + var collection = storage.getCollection(listBoxStorages.getSelectedValue()); + if (collection == null) + return; + collection.showBuses(graphics2D); super.repaint(); } }; pictureBoxCollection.setSize(new Dimension(700,450)); JButton buttonAddBus = new JButton("Добавить автобус"); - buttonAddBus.setPreferredSize(new Dimension(160,30)); textFieldNumber = new TextField(); + textFieldStorageName = new TextField(); + JScrollPane scrollPane = new JScrollPane(); JButton buttonRemoveBus = new JButton("Удалить автобус"); - buttonRemoveBus.setPreferredSize(new Dimension(160,30)); JButton buttonRefreshCollection = new JButton("Обновить коллекцию"); - buttonAddBus.setPreferredSize(new Dimension(160,30)); + JButton buttonAddCollection = new JButton("Добавить набор"); + listBoxModel = new DefaultListModel<>(); + listBoxStorages= new JList<>(listBoxModel); + scrollPane.setViewportView(listBoxStorages); + JButton buttonDeleteCollection = new JButton("Удалить набор"); + JButton buttonTrash = new JButton("Корзина"); buttonAddBus.addActionListener(e -> buttonAddBusClick()); buttonRemoveBus.addActionListener(e -> buttonRemoveBusClick()); buttonRefreshCollection.addActionListener(e -> buttonRefreshBusClick()); + buttonAddCollection.addActionListener(e -> buttonAddCollectionClick()); + buttonDeleteCollection.addActionListener(e -> buttonDeleteCollectionClick()); + buttonTrash.addActionListener(e -> buttonTrashClick()); + JPanel panelTools = new JPanel(new GridBagLayout()); + panelTools.setBorder(new StrokeBorder(new BasicStroke(3))); JPanel panelCollection = new JPanel(new GridBagLayout()); + panelCollection.setBorder(new StrokeBorder(new BasicStroke(3))); GridBagConstraints constraints = new GridBagConstraints(); - constraints.insets.left = constraints.insets.right = 2; - constraints.insets.top = constraints.insets.bottom = 30; + constraints.insets.left = constraints.insets.right = 5; + constraints.insets.top = constraints.insets.bottom = 5; constraints.fill = GridBagConstraints.BOTH; constraints.gridx = 0; constraints.gridy = 0; - panelCollection.add(buttonAddBus, constraints); + panelCollection.add(textFieldStorageName, constraints); constraints.gridx = 0; constraints.gridy = 1; - panelCollection.add(textFieldNumber, constraints); + panelCollection.add(buttonAddCollection, constraints); constraints.gridx = 0; constraints.gridy = 2; - panelCollection.add(buttonRemoveBus, constraints); + panelCollection.add(scrollPane, constraints); constraints.gridx = 0; constraints.gridy = 3; - panelCollection.add(buttonRefreshCollection, constraints); + panelCollection.add(buttonDeleteCollection, constraints); + constraints.gridx = 0; + constraints.gridy = 0; + panelTools.add(panelCollection, constraints); + constraints.gridx = 0; + constraints.gridy = 1; + panelTools.add(buttonAddBus, constraints); + constraints.gridx = 0; + constraints.gridy = 2; + panelTools.add(textFieldNumber, constraints); + constraints.gridx = 0; + constraints.gridy = 3; + panelTools.add(buttonRemoveBus, constraints); + constraints.gridx = 0; + constraints.gridy = 4; + panelTools.add(buttonRefreshCollection, constraints); + constraints.gridx = 0; + constraints.gridy = 5; + panelTools.add(buttonTrash, constraints); + setLayout(new BorderLayout()); - add(panelCollection, BorderLayout.EAST); + add(panelTools, BorderLayout.EAST); add(pictureBoxCollection,BorderLayout.CENTER); } private void buttonAddBusClick(){ + if (listBoxStorages.getSelectedIndex() == -1) + return; + var obj = storage.getCollection(listBoxStorages.getSelectedValue()); + if (obj == null) + return; FrameTrolleybus form; try{ form = new FrameTrolleybus(); @@ -65,7 +116,7 @@ public class FrameBusCollection extends JFrame { } form.selectBusButton.addActionListener(e -> { form.selectBus(); - if (buses.insert(form.getSelectedBus())) { + if (obj.insert(form.getSelectedBus())) { JOptionPane.showMessageDialog(this, "Объект добавлен"); pictureBoxCollection.repaint(); } else { @@ -75,10 +126,18 @@ public class FrameBusCollection extends JFrame { }); } private void buttonRemoveBusClick() { + if (listBoxStorages.getSelectedIndex() == -1) + return; + var obj = storage.getCollection(listBoxStorages.getSelectedValue()); + if (obj == null) + return; int pos = Integer.parseInt(textFieldNumber.getText()); - if (buses.remove(pos)) + var bus = obj.Get(pos); + trashCollection.push(obj.Get(pos)); + if (obj.remove(pos)) { JOptionPane.showMessageDialog(this,"Объект удалён"); + pictureBoxCollection.repaint(); } else { @@ -88,4 +147,48 @@ public class FrameBusCollection extends JFrame { private void buttonRefreshBusClick(){ pictureBoxCollection.repaint(); } + private void reloadObjects(){ + int index = listBoxStorages.getSelectedIndex(); + listBoxModel.clear(); + List keys = storage.Keys(); + for (String key : keys) { + listBoxModel.addElement(key); + } + if(listBoxModel.size() > 0 && (index == -1 || index >= listBoxModel.size())) + listBoxStorages.setSelectedIndex(0); + else if(listBoxModel.size() > 0) + listBoxStorages.setSelectedIndex(index); + } + private void buttonAddCollectionClick() { + if(textFieldStorageName.getText() == null ) { + JOptionPane.showMessageDialog(this, "Не все данные заполнены"); + return; + } + String name = textFieldStorageName.getText(); + if (Objects.equals(name, "")) { + JOptionPane.showMessageDialog(this, "Не все данные заполнены"); + return; + } + storage.addSet(name); + reloadObjects(); + } + private void buttonDeleteCollectionClick() { + if (listBoxStorages.getSelectedIndex() == -1) + return; + storage.delSet(listBoxStorages.getSelectedValue()); + reloadObjects(); + } + private void buttonTrashClick(){ + if(trashCollection.getSize() == 0) + return; + FrameTrolleybus form; + try{ + form = new FrameTrolleybus(); + } + catch (IOException e){ + throw new RuntimeException(); + } + form.ChangeTrolleybus(trashCollection.getTop()); + trashCollection.pop(); + } } diff --git a/src/FrameTrolleybus.java b/src/FrameTrolleybus.java index 1c39920..777b209 100644 --- a/src/FrameTrolleybus.java +++ b/src/FrameTrolleybus.java @@ -38,6 +38,7 @@ public class FrameTrolleybus extends JFrame { pictureBoxTrolleybus.setBounds( 0, 0, getContentPane().getWidth(), getContentPane().getHeight()); createBusButton.addActionListener(e -> buttonCreateBusClick()); createTrolleybusButton.addActionListener(e -> buttonCreateTrolleybusClick()); + selectBusButton.addActionListener(e -> dispose()); stepButton.addActionListener(e -> buttonStepClick()); rightButton.setActionCommand("right"); rightButton.addActionListener(this::buttonMoveClick); @@ -187,5 +188,12 @@ public class FrameTrolleybus extends JFrame { if (drawingBus == null) { return; } - selectedBus = drawingBus;} -} \ No newline at end of file + selectedBus = drawingBus; + } + public void ChangeTrolleybus(DrawingBus bus){ + bus.setPosition(0,0); + drawingBus = bus; + pictureBoxTrolleybus.setBounds(0,0,getContentPane().getWidth(),getContentPane().getHeight()); + pictureBoxTrolleybus.repaint(); + } +} diff --git a/src/Main.java b/src/Main.java index 8002bc5..a93cc29 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,4 +1,4 @@ import java.io.IOException; public class Main { - public static void main(String[] args) throws IOException { new FrameHard(); } + public static void main(String[] args) throws IOException { new FrameBusCollection(); } } diff --git a/src/SetGeneric.java b/src/SetGeneric.java index 127715a..6fcd678 100644 --- a/src/SetGeneric.java +++ b/src/SetGeneric.java @@ -1,39 +1,44 @@ import java.lang.reflect.Array; - +import java.util.ArrayList; +import java.util.List; public class SetGeneric{ - private final T[] places; - public int getCount() {return places.length;} - public SetGeneric(int count, Class type){ - places = (T[]) Array.newInstance(type, count); + private final List places; + private final int maxCount; + public int getCount() {return places.size();} + public SetGeneric(int count){ + maxCount = count; + places = new ArrayList<>(); } public boolean insert(T bus){ - return insert(bus, 0); + if(places.size() == maxCount) + return false; + insert(bus, 0); + return true; } public boolean insert(T bus, int position){ - if (!(position >= 0 && position < places.length)) + if (!(position >= 0 && position <= places.size() && places.size() < maxCount)) return false; - if (places[position] != null) - { - int ind = position; - while (ind < places.length && places[ind] != null) - ind++; - if (ind == places.length) - return false; - for (int i = ind - 1; i >= position; i--) - places[i + 1] = places[i]; - } - places[position] = bus; + places.add(position, bus); return true; } public boolean remove(int position){ if(!(position >= 0 && position < getCount())) return false; - places[position] = null; + places.remove(position); return true; } public T Get(int position){ if(!(position >= 0 && position < getCount())) return null; - return places[position]; + return (T)places.get(position); + } + public ArrayList GetBuses(int maxBuses){ + ArrayList toRet = new ArrayList<>(); + for(int i = 0; i < places.size(); i++){ + toRet.add(places.get(i)); + if(i == maxBuses) + return toRet; + } + return toRet; } } diff --git a/src/TrashCollection.java b/src/TrashCollection.java new file mode 100644 index 0000000..8518aa9 --- /dev/null +++ b/src/TrashCollection.java @@ -0,0 +1,22 @@ +import java.util.ArrayDeque; +import java.util.Queue; +public class TrashCollection { + Queue _queue; + public TrashCollection(){ + _queue = new ArrayDeque<>(); + } + public void push(T monorail){ + _queue.add(monorail); + } + public int getSize(){ + return _queue.size(); + } + public void pop(){ + if(_queue.size() ==0) + return; + _queue.remove(); + } + public T getTop(){ + return _queue.peek(); + } +}