Залил лаб4

This commit is contained in:
ujijrujijr 2023-12-01 19:42:28 +03:00
parent 4f75d6a8b6
commit 24c3532ab2
6 changed files with 300 additions and 61 deletions

View File

@ -36,6 +36,14 @@ public class BusesGenericCollection <T extends DrawingBus, U extends IMoveableOb
public U GetU(int pos){
return (U)_collection.Get(pos).GetMoveableObject();
}
public T Get(int position) {
if (position < 0 || position >= _collection.Count) {
return null;
}
return _collection.Get(position);
}
//Вывод всех объектов
public void ShowBuses(JPanel panelToDraw) {
Graphics gr = panelToDraw.getGraphics();

View File

@ -0,0 +1,54 @@
package Trolleybus;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
public class BusesGenericStorage {
final HashMap<String, BusesGenericCollection<DrawingBus, DrawingObjectBus>> _busStorages;
public List<String> 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<DrawingBus, DrawingObjectBus> 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);
}
}

View File

@ -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<DrawingBus, DrawingObjectBus> _buses;
private final BusesGenericStorage _storage;
private QueueBusesCollection<DrawingBus> _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<String> listBoxSets;
private DefaultListModel<String> 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<DrawingBus, DrawingObjectBus> 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<DrawingBus, DrawingObjectBus> 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<DrawingBus, DrawingObjectBus> 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<DrawingBus, DrawingObjectBus> 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<String> 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);
}
}
}

View File

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

View File

@ -0,0 +1,29 @@
package Trolleybus;
import java.util.ArrayDeque;
import java.util.Queue;
public class QueueBusesCollection <T extends DrawingBus> {
Queue <T> _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();
}
}

View File

@ -1,11 +1,17 @@
package Trolleybus;
import java.util.List;
import java.util.ArrayList;
public class SetGeneric <T extends Object>{
private final Object[] _places;
private final List<T> _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 <T extends Object>{
//Вставка на какую-то позицию
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 <T extends Object>{
{
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<T> GetBuses(int maxBus){
ArrayList<T> toReturn = new ArrayList<>();
for (int i = 0; i < _maxCount; i++) {
toReturn.add(_places.get(i));
if (i == maxBus) {
return toReturn;
}
}
return toReturn;
}
}