From 4d7b7e95a95151fb56177ce22d94b448a754dc89 Mon Sep 17 00:00:00 2001 From: Sergey Kozyrev Date: Sat, 4 Nov 2023 19:58:26 +0400 Subject: [PATCH] Laba4 KozyrevSS GasolineTanker JAVA HARD --- BaseFrame.java | 100 ++++++++++++++++++++++ CarsGenericCollection.java | 2 +- CarsGenericStorage.java | 46 ++++++++++ CollectionFrame.java | 171 ++++++++++++++++++++++++++++++++++--- Main.java | 4 +- SetGeneric.java | 78 ++++++++++------- 6 files changed, 357 insertions(+), 44 deletions(-) create mode 100644 CarsGenericStorage.java diff --git a/BaseFrame.java b/BaseFrame.java index f887576..c423f71 100644 --- a/BaseFrame.java +++ b/BaseFrame.java @@ -9,6 +9,7 @@ class DrawGasoline extends JComponent { private AbstractStrategy _abstractStrategy; private DrawTanker SelectedCar; public DrawTanker GetSelectedCar() {return SelectedCar;} + protected void SetTanker(DrawTanker tanker) {_drawTanker = tanker;} public void paintComponent(Graphics g) { super.paintComponent(g); @@ -104,6 +105,11 @@ class BaseFrame extends JFrame { initUI(); } + public BaseFrame(DrawTanker gas) + { + initUIFrom(); + Gasoline.SetTanker(gas); + } protected static final int Width = 1000; protected static final int Height = 600; DrawGasoline Gasoline; @@ -203,6 +209,100 @@ class BaseFrame extends JFrame { }); } + private void initUIFrom() + { + setSize(Width, Height); + setTitle("TankGasoline"); + setLocationRelativeTo(null); + setLayout(null); + setResizable(false); + Gasoline = new DrawGasoline(); + Gasoline.setBounds(0, 0, Width, Height); + add(Gasoline); + + MoveAL moving = new MoveAL(); + + JButton buttonUp = new JButton(); + buttonUp.setActionCommand("U"); + buttonUp.setBounds(Width - 90, Height - 120,30,30); + buttonUp.setLayout(null); + add(buttonUp); + buttonUp.addActionListener(moving); + + JButton buttonRight = new JButton(); + buttonRight.setActionCommand("R"); + buttonRight.setBounds(Width - 60, Height - 90,30,30); + buttonRight.setLayout(null); + add(buttonRight); + buttonRight.addActionListener(moving); + + JButton buttonLeft = new JButton(); + buttonLeft.setActionCommand("L"); + buttonLeft.setBounds(Width - 120, Height - 90,30,30); + buttonLeft.setLayout(null); + add(buttonLeft); + buttonLeft.addActionListener(moving); + + JButton buttonDown = new JButton(); + buttonDown.setActionCommand("D"); + buttonDown.setBounds(Width - 90, Height - 90,30,30); + buttonDown.setLayout(null); + add(buttonDown); + buttonDown.addActionListener(moving); + + String[] items = { + "0", + "1" + }; + JComboBox strategy = new JComboBox(items); + + strategy.setBounds(Width - 100, 100, 80, 20); + strategy.setLayout(null); + strategy.setEnabled(true); + add(strategy); + + JButton buttonStrategy = new JButton(); + buttonStrategy.setBounds(Width - 60, 120, 40, 20); + buttonStrategy.setLayout(null); + add(buttonStrategy); + buttonStrategy.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Gasoline.ButtonStep_Click(strategy, Width, Height); + } + }); + + + buttonUp.setIcon(new ImageIcon("Arrows/Up.png")); + buttonDown.setIcon(new ImageIcon("Arrows/Down.png")); + buttonLeft.setIcon(new ImageIcon("Arrows/Left.png")); + buttonRight.setIcon(new ImageIcon("Arrows/Right.png")); + + JButton buttonCreateTanker = new JButton("Create Base Tanker"); + buttonCreateTanker.setBounds(60, Height - 120, 200, 50); + buttonCreateTanker.setLayout(null); + add(buttonCreateTanker); + buttonCreateTanker.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Gasoline.CreateBaseTankerButton_Click(); + } + }); + JButton buttonCreateGasolineTanker = new JButton("Create Update Tanker"); + buttonCreateGasolineTanker.setBounds(260, Height - 120, 200, 50); + buttonCreateGasolineTanker.setLayout(null); + add(buttonCreateGasolineTanker); + buttonCreateGasolineTanker.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Gasoline.CreateGasolineTankerButton_Click(); + } + }); + } + private void SetTanker(DrawTanker tanker) + { + Gasoline.SetTanker(tanker); + } public class MoveAL implements ActionListener { @Override public void actionPerformed(ActionEvent e) { diff --git a/CarsGenericCollection.java b/CarsGenericCollection.java index 7f41796..23a03c1 100644 --- a/CarsGenericCollection.java +++ b/CarsGenericCollection.java @@ -21,7 +21,7 @@ public class CarsGenericCollection > _carStorages; + public ArrayList Keys() + { + return new ArrayList<>(_carStorages.keySet()); + } + private final int _pictureWidth; + private final int _pictureHeight; + public CarsGenericStorage(int pictureWidth, int pictureHeight) + { + _pictureHeight = pictureHeight; + _pictureWidth = pictureWidth; + _carStorages = new HashMap<>(); + } + public void AddSet(String name) + { + if (Keys().contains(name)) + return; + _carStorages.put(name, new CarsGenericCollection<>(_pictureWidth, _pictureHeight)); + } + public void DelSet(String name) + { + if (!Keys().contains(name)) + return; + _carStorages.remove(name); + } + + public CarsGenericCollection get(String ind) + { + if (Keys().contains(ind)) + return _carStorages.get(ind); + return null; + } + public DrawingObjectTanker get(String name, int ind) + { + if (!Keys().contains(name)) + return null; + return _carStorages.get(name).GetU(ind); + } + + + +} diff --git a/CollectionFrame.java b/CollectionFrame.java index 63bdb2a..29365fb 100644 --- a/CollectionFrame.java +++ b/CollectionFrame.java @@ -1,33 +1,98 @@ import javax.swing.*; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.image.CropImageFilter; +import java.util.LinkedList; +import java.util.PriorityQueue; +import java.util.Queue; class CollectionFrame extends JComponent { - private final CarsGenericCollection _tanks; + private final CarsGenericStorage _tanksStorage; + private final GarageFrame frame; + private Queue removedTankers; protected final int Width; protected final int Height; - public CollectionFrame(int width, int height) + public CollectionFrame(int width, int height, GarageFrame fr) { Width = width; Height = height; - _tanks = new CarsGenericCollection<>(Width, Height); + _tanksStorage = new CarsGenericStorage(Width, Height); + frame = fr; + removedTankers = new LinkedList<>(); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); - g.drawImage(_tanks.ShowCars(), 0, 0, this); + if (frame.listStorage.getSelectedIndex() == -1) + return; + var obj = _tanksStorage.get(frame.listStorage.getSelectedValue()); + if (obj == null) + return; + if (obj.ShowCars() == null) + return; + g.drawImage(obj.ShowCars(), 0, 0, this); super.repaint(); } + + protected void ReloadObjects() + { + int index = frame.listStorage.getSelectedIndex(); + frame.listModel.clear(); + for (String key : _tanksStorage.Keys()) + { + frame.listModel.addElement(key); + } + if (!frame.listModel.isEmpty() && (index == -1 || index >= frame.listModel.size())) + { + frame.listStorage.setSelectedIndex(0); + } + else if (!frame.listModel.isEmpty() && index > -1 && index < frame.listModel.size()) + { + frame.listStorage.setSelectedIndex(index); + } + + } + protected void ButtonAddObject_Click() + { + String name = frame.nameStorageField.getText(); + if (name.length() == 0) + return; + _tanksStorage.AddSet(name); + ReloadObjects(); + } + + protected void ButtonRemoveObject_Click() + { + if (frame.listStorage.getSelectedIndex() == -1) + { + return; + } + if (JOptionPane.showConfirmDialog(null, "Delete object " + frame.listStorage.getSelectedValue() + "?", "Delete", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) + { + return; + } + _tanksStorage.DelSet(frame.listStorage.getSelectedValue()); + ReloadObjects(); + } + protected void ButtonAddTank_Click() { + if (frame.listStorage.getSelectedIndex() == -1) + return; + var obj = _tanksStorage.get(frame.listStorage.getSelectedValue()); + if (obj == null) + return; BaseFrame form = new BaseFrame(); form.setVisible(true); form.buttonSelect.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e){ - if (_tanks.plus(form.Gasoline.GetSelectedCar()) != -1) + + if (obj.plus(form.Gasoline.GetSelectedCar()) != -1) { form.dispose(); JOptionPane.showMessageDialog(null, "Объект добавлен", "Информация", JOptionPane.INFORMATION_MESSAGE); @@ -47,11 +112,23 @@ class CollectionFrame extends JComponent { protected void ButtonRemoveTank_Click(String text) { + if (frame.listStorage.getSelectedIndex() == -1) + return; + var obj = _tanksStorage.get(frame.listStorage.getSelectedValue()); + if (obj == null) + return; if (JOptionPane.showConfirmDialog(null, "Delete Tanker?", "Delete", JOptionPane.YES_NO_OPTION) == JOptionPane.OK_OPTION) { - if (_tanks.minus(Integer.parseInt(text))) + int index = -1; + DrawTanker deleted = null; + try { + deleted = obj.minus(Integer.parseInt(text)); + } catch(NumberFormatException e) { + } + if (deleted != null) { JOptionPane.showMessageDialog(null, "Объект удален", "Информация", JOptionPane.INFORMATION_MESSAGE); + removedTankers.add(deleted); super.repaint(); } else @@ -64,6 +141,14 @@ class CollectionFrame extends JComponent { protected void ButtonUpdate_Click() {super.repaint();} + protected void ButtonCreateDeleted_Click() + { + if (removedTankers.isEmpty()) + return; + var tank = removedTankers.poll(); + BaseFrame f = new BaseFrame(tank); + f.setVisible(true); + } } class GarageFrame extends JFrame { @@ -75,6 +160,18 @@ class GarageFrame extends JFrame { protected static final int Width = 1000; protected static final int Height = 600; CollectionFrame Collection; + + JButton addTankerButton; + JTextField indexTankerField; + JButton deleteTankerButton; + JButton updateCollectionButton; + JList listStorage; + DefaultListModel listModel; + JButton addCollectionButton; + JTextField nameStorageField; + JButton deleteCollectionbutton; + JButton createDeletedButton; + private void initUI() { setSize(Width, Height); @@ -85,7 +182,7 @@ class GarageFrame extends JFrame { setResizable(false); - JButton addTankerButton = new JButton("Add tanker"); + addTankerButton = new JButton("Add tanker"); addTankerButton.setLayout(null); addTankerButton.setBounds(Width-200, Height-550, 200, 30); add(addTankerButton); @@ -96,12 +193,12 @@ class GarageFrame extends JFrame { } }); - JTextField indexTankerField = new JTextField(); + indexTankerField = new JTextField(); indexTankerField.setBounds(Width- 200, Height-500, 200, 30); indexTankerField.setLayout(null); add(indexTankerField); - JButton deleteTankerButton = new JButton("Delete tanker"); + deleteTankerButton = new JButton("Delete tanker"); deleteTankerButton.setLayout(null); deleteTankerButton.setBounds(Width-200, Height-450, 200, 30); add(deleteTankerButton); @@ -112,7 +209,7 @@ class GarageFrame extends JFrame { } }); - JButton updateCollectionButton = new JButton("Update collection"); + updateCollectionButton = new JButton("Update collection"); updateCollectionButton.setLayout(null); updateCollectionButton.setBounds(Width-200, Height-400, 200, 30); add(updateCollectionButton); @@ -123,7 +220,59 @@ class GarageFrame extends JFrame { } }); - Collection = new CollectionFrame(Width-200, Height); + listModel = new DefaultListModel<>(); + listStorage = new JList(listModel); + listStorage.setLayout(null); + listStorage.setBounds(Width - 190, Height - 250, 180, 130); + add(listStorage); + listStorage.addListSelectionListener(new ListSelectionListener() { + @Override + public void valueChanged(ListSelectionEvent e) { + Collection.repaint(); + } + }); + + + addCollectionButton = new JButton("Add Collection"); + addCollectionButton.setLayout(null); + addCollectionButton.setBounds(Width-190, Height - 350, 180, 30); + add(addCollectionButton); + addCollectionButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Collection.ButtonAddObject_Click(); + } + }); + + nameStorageField = new JTextField(); + nameStorageField.setBounds(Width- 190, Height- 300, 180, 30); + nameStorageField.setLayout(null); + add(nameStorageField); + + + deleteCollectionbutton = new JButton("Remove Collection"); + deleteCollectionbutton.setBounds(Width-190, Height - 100, 180, 30); + deleteCollectionbutton.setLayout(null); + add(deleteCollectionbutton); + deleteCollectionbutton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Collection.ButtonRemoveObject_Click(); + } + }); + + createDeletedButton = new JButton("Create deleted"); + createDeletedButton.setLayout(null); + createDeletedButton.setBounds(Width - 200, 10, 200, 30); + add(createDeletedButton); + createDeletedButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Collection.ButtonCreateDeleted_Click(); + } + }); + + Collection = new CollectionFrame(Width-200, Height, this); Collection.setLayout(null); Collection.setBounds(0, 0, Width-200, Height); add(Collection); diff --git a/Main.java b/Main.java index 618cc09..5bbd9f0 100644 --- a/Main.java +++ b/Main.java @@ -1,7 +1,7 @@ public class Main { public static void main(String[] args) { - //GarageFrame a = new GarageFrame(); - ComboFrame a = new ComboFrame(); + GarageFrame a = new GarageFrame(); + //ComboFrame a = new ComboFrame(); a.setVisible(true); } } \ No newline at end of file diff --git a/SetGeneric.java b/SetGeneric.java index cf235bd..9865c41 100644 --- a/SetGeneric.java +++ b/SetGeneric.java @@ -1,9 +1,15 @@ +import java.util.ArrayList; +import java.util.Iterator; +import java.util.NoSuchElementException; + public class SetGeneric { - private final T[] _places; - public int Count() {return _places.length;} + private final ArrayList _places; + public int Count() {return _places.size();} + private final int _maxCount; public SetGeneric(int count) { - _places = (T[]) new Object[count]; + _maxCount = count; + _places = new ArrayList<>(); } public int Insert(T tanker) { @@ -11,37 +17,19 @@ public class SetGeneric { } public int Insert(T tanker, int position) { - if (position < 0 || position >= Count()) + if (position < 0 || position >= _maxCount) return -1; - if (_places[position] == null) - { - _places[position] = tanker; - return position; - } - int index = -1; - for (int i = position; i < Count(); i++) - { - if (_places[i] == null) - { - index = i; break; - } - } - if (index < 0) - return -1; - for (int i = index; i > position; i--) - { - _places[i] = _places[i - 1]; - } - _places[position] = tanker; + _places.add(position, tanker); return position; } - public boolean Remove(int position) + public T Remove(int position) { - if (position < 0 || position > Count()) - return false; - _places[position] = null; - return true; + if (position < 0 || position >= Count()) + return null; + var returning = _places.get(position); + _places.remove(position); + return returning; } public T Get(int position) @@ -50,7 +38,37 @@ public class SetGeneric { { return null; } - return (T)_places[position]; + return _places.get(position); } + public Iterable GetTankers(final Integer maxTankers) { + return new Iterable() { + @Override + public Iterator iterator() { + return new Iterator() { + private int currentIndex = 0; + private int count = 0; + + @Override + public boolean hasNext() { + return currentIndex < _places.size() && (maxTankers == null || count < maxTankers); + } + + @Override + public T next() { + if (hasNext()) { + count++; + return _places.get(currentIndex++); + } + throw new NoSuchElementException(); + } + + @Override + public void remove() { + throw new UnsupportedOperationException(); + } + }; + } + }; + } }