Залил лаб4
This commit is contained in:
parent
4f75d6a8b6
commit
24c3532ab2
@ -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();
|
||||
|
54
Trolleybus/BusesGenericStorage.java
Normal file
54
Trolleybus/BusesGenericStorage.java
Normal 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);
|
||||
}
|
||||
}
|
@ -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() {
|
||||
@ -59,15 +88,59 @@ public class FormBusesCollection {
|
||||
}
|
||||
});
|
||||
|
||||
//Поле ввода
|
||||
positionTextField = new JTextField();
|
||||
positionTextField.setBounds(10, 60, 150, 30);
|
||||
buttonAddSet.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
buttonAddSet_Click(e);
|
||||
}
|
||||
});
|
||||
|
||||
//Добавление кнопок на панель panelTools
|
||||
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(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
|
||||
{
|
||||
@ -95,6 +178,16 @@ public class FormBusesCollection {
|
||||
}
|
||||
|
||||
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) {
|
||||
@ -110,9 +203,11 @@ public class FormBusesCollection {
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
29
Trolleybus/QueueBusesCollection.java
Normal file
29
Trolleybus/QueueBusesCollection.java
Normal 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();
|
||||
}
|
||||
}
|
@ -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,47 +20,27 @@ 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;
|
||||
}
|
||||
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;
|
||||
|
||||
}
|
||||
//индекс в массиве, по которому вставили, т.е. вставка прошла успешно
|
||||
if (Count + 1 <= _maxCount) {
|
||||
_places.add(position, bus);
|
||||
Count++;
|
||||
return position;
|
||||
}
|
||||
// Места нет
|
||||
return -1;
|
||||
}
|
||||
public boolean Remove(int position)
|
||||
{
|
||||
if (position >= Count || position < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
_places[position] = null;
|
||||
_places.remove(position);
|
||||
Count--;
|
||||
return true;
|
||||
}
|
||||
public T Get(int position)
|
||||
@ -63,6 +49,16 @@ public class SetGeneric <T extends Object>{
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return (T)_places[position];
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user