diff --git a/Trolleybus/BusesGenericCollection.java b/Trolleybus/BusesGenericCollection.java index 337455c..0981be8 100644 --- a/Trolleybus/BusesGenericCollection.java +++ b/Trolleybus/BusesGenericCollection.java @@ -36,6 +36,14 @@ public class BusesGenericCollection = _collection.Count) { + return null; + } + return _collection.Get(position); + } + //Вывод всех объектов public void ShowBuses(JPanel panelToDraw) { Graphics gr = panelToDraw.getGraphics(); diff --git a/Trolleybus/BusesGenericStorage.java b/Trolleybus/BusesGenericStorage.java new file mode 100644 index 0000000..1c748a8 --- /dev/null +++ b/Trolleybus/BusesGenericStorage.java @@ -0,0 +1,54 @@ +package Trolleybus; + +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); + } + + //В Java нельзя перегружать операторы, в том числе индексаторы, поэтому ниже их замены + public BusesGenericCollection Get(String name){ + if (!_busStorages.containsKey(name)) { + return null; + } + return _busStorages.get(name); + } + + public DrawingBus Get(String nameOfCollection, int positionInCollection){ + return _busStorages.get(nameOfCollection).Get(positionInCollection); + } +} \ No newline at end of file diff --git a/Trolleybus/FormBusesCollection.java b/Trolleybus/FormBusesCollection.java index abed957..b61af16 100644 --- a/Trolleybus/FormBusesCollection.java +++ b/Trolleybus/FormBusesCollection.java @@ -1,18 +1,27 @@ package Trolleybus; import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; + import java.awt.*; import java.awt.event.*; +import java.util.List; public class FormBusesCollection { - private final BusesGenericCollection _buses; + private final BusesGenericStorage _storage; + private QueueBusesCollection _queueCollection; private JFrame frameBusesCollection; - private JPanel panelBusesCollection, panelTools; - private JButton buttonAddBus, buttonRemoveBus, buttonRefreshCollection; - private JTextField positionTextField; //поле для ввода номера позиции + private JPanel panelBusesCollection, panelTools, panelSets; + private JButton buttonAddBus, buttonRemoveBus, buttonRefreshCollection, buttonAddSet, buttonDelSet, buttonQueue; + private JTextField positionTextField, nameOfSetTextField; //поля ввода + private JList listBoxSets; + private DefaultListModel listBoxModel; //модель для получения/редактирования записей listBoxSets + public FormBusesCollection() { InitializeComponent(); - _buses = new BusesGenericCollection<>(panelBusesCollection.getWidth(), panelBusesCollection.getHeight()); + _storage = new BusesGenericStorage(panelBusesCollection.getWidth(), panelBusesCollection.getHeight()); + _queueCollection = new QueueBusesCollection<>(); } private void InitializeComponent() { @@ -31,15 +40,35 @@ public class FormBusesCollection { panelTools.setLayout(null); panelTools.setPreferredSize(new Dimension(170, 600)); + //Панель для работы с наборами + panelSets = new JPanel(); + panelSets.setBorder(BorderFactory.createLineBorder(Color.BLACK)); + panelSets.setLayout(null); + panelSets.setBounds(10, 10, 150, 300); + //Кнопки панели panelTools buttonAddBus = new JButton("Добавить автобус"); - buttonAddBus.setBounds(10, 10, 150, 40); + buttonAddBus.setBounds(10, 320, 150, 40); buttonRemoveBus = new JButton("Удалить автобус"); - buttonRemoveBus.setBounds(10, 100, 150, 40); + buttonRemoveBus.setBounds(10, 410, 150, 40); buttonRefreshCollection = new JButton("Обновить коллекцию"); - buttonRefreshCollection.setBounds(10, 150, 150, 40); + buttonRefreshCollection.setBounds(10, 460, 150, 40); + + buttonQueue = new JButton("Очередь"); + buttonQueue.setBounds(10, 510, 150, 40); + + //Элементы панели panelSets + buttonAddSet = new JButton("Добавить набор"); + buttonAddSet.setBounds(10, 50, 130, 30); + + listBoxModel = new DefaultListModel<>(); + listBoxSets = new JList<>(listBoxModel); + listBoxSets.setBounds(10, 90, 130, 100); + + buttonDelSet = new JButton("Удалить набор"); + buttonDelSet.setBounds(10, 200, 130, 30); //Добавление листенеров к кнопкам buttonAddBus.addActionListener(new ActionListener() { @@ -58,16 +87,60 @@ public class FormBusesCollection { buttonRefreshCollection_Click(e); } }); - - //Поле ввода - positionTextField = new JTextField(); - positionTextField.setBounds(10, 60, 150, 30); - //Добавление кнопок на панель panelTools + buttonAddSet.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + buttonAddSet_Click(e); + } + }); + + buttonDelSet.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + buttonDelSet_Click(e); + } + }); + + buttonQueue.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + buttonQueue_Click(e); + } + }); + + // Листенер изменения индекса в списке + listBoxSets.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + if (listBoxSets.getSelectedIndex() == -1) { + return; + } + BusesGenericCollection obj = _storage.Get(listBoxSets.getSelectedValue()); + if (obj == null) { + return; + } + obj.ShowBuses(panelBusesCollection); + } + }); + + //Поля ввода + positionTextField = new JTextField(); + positionTextField.setBounds(10, 370, 150, 30); + + nameOfSetTextField = new JTextField(); + nameOfSetTextField.setBounds(10, 10, 130, 30); + + //Добавление элементов на панель panelTools + panelTools.add(panelSets); panelTools.add(buttonAddBus); panelTools.add(positionTextField); panelTools.add(buttonRemoveBus); - panelTools.add(buttonRefreshCollection); + panelTools.add(buttonRefreshCollection); + panelTools.add(buttonQueue); + + //Добавление элементов на панель panelSets + panelSets.add(nameOfSetTextField); + panelSets.add(buttonAddSet); + panelSets.add(buttonDelSet); + panelSets.add(listBoxSets); frameBusesCollection.add(panelBusesCollection, BorderLayout.CENTER); frameBusesCollection.add(panelTools, BorderLayout.EAST); @@ -76,14 +149,24 @@ public class FormBusesCollection { private void buttonAddBus_Click(ActionEvent e) { FormTrolleybus form = new FormTrolleybus(); + if (listBoxSets.getSelectedIndex() == -1) + { + return; + } + BusesGenericCollection obj = _storage.Get(listBoxSets.getSelectedValue()); + if (obj == null) + { + return; + } + //Листенер для кнопки выбора автобуса на той форме form.buttonSelect.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { DrawingBus SelectedBus = form.getBus(); - if (_buses.Add(SelectedBus) != -1) + if (obj.Add(SelectedBus) != -1) { JOptionPane.showMessageDialog(null, "Объект добавлен"); - _buses.ShowBuses(panelBusesCollection); + obj.ShowBuses(panelBusesCollection); } else { @@ -94,7 +177,17 @@ public class FormBusesCollection { }); } - private void buttonRemoveBus_Click(ActionEvent e) { + private void buttonRemoveBus_Click(ActionEvent e) { + if (listBoxSets.getSelectedIndex() == -1) + { + return; + } + BusesGenericCollection obj = _storage.Get(listBoxSets.getSelectedValue()); + if (obj == null) + { + return; + } + String pos_string = positionTextField.getText(); //Если строка не заполнена (имеет то же значение, что и пустая строка), то считаем, что ввели 0 if (pos_string.compareTo(" ") == 0) { @@ -108,11 +201,13 @@ public class FormBusesCollection { //Если ввели не цифры, то тоже считаем, что ввели 0 catch(Exception ex) { pos = 0; - } - - if (_buses.Remove(pos)) { + } + + // Добавление удаляемого автобуса в очередь перед самим удалением + _queueCollection.Push(obj.Get(pos)); + if (obj.Remove(pos)) { JOptionPane.showMessageDialog(null, "Объект удален"); - _buses.ShowBuses(panelBusesCollection); + obj.ShowBuses(panelBusesCollection); } else { JOptionPane.showMessageDialog(null, "Не удалось удалить объект"); @@ -120,6 +215,57 @@ public class FormBusesCollection { } private void buttonRefreshCollection_Click(ActionEvent e) { - _buses.ShowBuses(panelBusesCollection); + if (listBoxSets.getSelectedIndex() == -1) + { + return; + } + BusesGenericCollection obj = _storage.Get(listBoxSets.getSelectedValue()); + if (obj == null) { + return; + } + obj.ShowBuses(panelBusesCollection); } + + private void buttonAddSet_Click(ActionEvent e) { + String name = nameOfSetTextField.getText(); + if (name == null || name.trim().length() == 0) { + return; + } + _storage.AddSet(nameOfSetTextField.getText()); + ReloadObjects(); + } + + private void buttonDelSet_Click(ActionEvent e) { + if (listBoxSets.getSelectedIndex() == -1) { + return; + } + _storage.DelSet(listBoxSets.getSelectedValue()); + ReloadObjects(); + } + + private void buttonQueue_Click(ActionEvent e) { + // Если в очередь ничего не добавили, то новую форму открывать не надо + if (_queueCollection.Size() == 0) { + JOptionPane.showMessageDialog(null, "Очередь пустая"); + return; + } + FormTrolleybus form = new FormTrolleybus(); + // Вывод в форме первого в очереди объекта и удаление его из очереди + form.ShowBus(_queueCollection.Pop()); + } + + private void ReloadObjects() { + int index = listBoxSets.getSelectedIndex(); + listBoxModel.clear(); + List keys = _storage.Keys(); + for (int i = 0; i < keys.size(); i++) { + listBoxModel.addElement(keys.get(i)); + } + if (listBoxModel.size() > 0 && (index == -1 || index >= listBoxModel.size())) { + listBoxSets.setSelectedIndex(0); + } + else if (listBoxModel.size() > 0) { + listBoxSets.setSelectedIndex(index); + } + } } \ No newline at end of file diff --git a/Trolleybus/FormTrolleybus.java b/Trolleybus/FormTrolleybus.java index 3442bb1..1dfb7a2 100644 --- a/Trolleybus/FormTrolleybus.java +++ b/Trolleybus/FormTrolleybus.java @@ -21,7 +21,7 @@ public class FormTrolleybus{ frameTrolleybus.setLayout(new BorderLayout()); frameTrolleybus.setSize(900, 500); frameTrolleybus.setTitle("Троллейбус"); - frameTrolleybus.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frameTrolleybus.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //Панель, на которую добавляю всё panelTrolleybus = new JPanel(); @@ -260,4 +260,10 @@ public class FormTrolleybus{ public Frame getFrame() { return frameTrolleybus; } + // Метод для 4 усложн., когда отображается автобус из очереди + public void ShowBus(DrawingBus bus) { + _drawingBus = bus; + _drawingBus.SetPosition(100,100); + Draw(); + } } \ No newline at end of file diff --git a/Trolleybus/QueueBusesCollection.java b/Trolleybus/QueueBusesCollection.java new file mode 100644 index 0000000..3c83443 --- /dev/null +++ b/Trolleybus/QueueBusesCollection.java @@ -0,0 +1,29 @@ +package Trolleybus; + +import java.util.ArrayDeque; +import java.util.Queue; + +public class QueueBusesCollection { + Queue _queue; + + public QueueBusesCollection() { + _queue = new ArrayDeque<>(); + } + + //Добавление в конец очереди + public void Push(T bus){ + if (bus == null) { + return; + } + _queue.add(bus); + } + + public int Size(){ + return _queue.size(); + } + + // Удаление из начала очереди + public T Pop(){ + return _queue.pop(); + } +} diff --git a/Trolleybus/SetGeneric.java b/Trolleybus/SetGeneric.java index c292df7..5f2af79 100644 --- a/Trolleybus/SetGeneric.java +++ b/Trolleybus/SetGeneric.java @@ -1,11 +1,17 @@ package Trolleybus; +import java.util.List; +import java.util.ArrayList; + public class SetGeneric { - private final Object[] _places; + private final List _places; public int Count; + private final int _maxCount; + public SetGeneric(int count){ - _places = new Object[count]; - Count = count; + _places = new ArrayList<>(); + _maxCount = count; + Count = 0; } //Вставка в начало public int Insert(T bus){ @@ -14,39 +20,18 @@ public class SetGeneric { //Вставка на какую-то позицию public int Insert(T bus, int position) { - if (position >= Count || position < 0) + if (position >= _maxCount || position < 0) { + //позиция неверная, значит вставить нельзя return -1; } - - if (_places[position] == null) - { - _places[position] = bus; + if (Count + 1 <= _maxCount) { + _places.add(position, bus); + Count++; + return position; } - else - { - //проверка, что в массиве после вставляемого эл-а есть место - int index = position; - while (_places[index] != null) - { - index++; - if (index >= Count) - { - //места в массиве нет, т.е. ни по какому индексу вставить нельзя - return -1; - } - } - for (int i = index; i > position; i--) - { - _places[i] = _places[i - 1]; - - } - //вставка по позиции - _places[position] = bus; - - } - //индекс в массиве, по которому вставили, т.е. вставка прошла успешно - return position; + // Места нет + return -1; } public boolean Remove(int position) { @@ -54,15 +39,26 @@ public class SetGeneric { { return false; } - _places[position] = null; + _places.remove(position); + Count--; return true; } public T Get(int position) + { + if (position >= Count || position < 0) { - if (position >= Count || position < 0) - { - return null; - } - return (T)_places[position]; + return null; } + return (T)_places.get(position); + } + public ArrayList GetBuses(int maxBus){ + ArrayList toReturn = new ArrayList<>(); + for (int i = 0; i < _maxCount; i++) { + toReturn.add(_places.get(i)); + if (i == maxBus) { + return toReturn; + } + } + return toReturn; + } }