diff --git a/src/MonorailHard/DrawningObjects/DrawningMonorail.java b/src/MonorailHard/DrawningObjects/DrawningMonorail.java index 1f03901..1d3b92a 100644 --- a/src/MonorailHard/DrawningObjects/DrawningMonorail.java +++ b/src/MonorailHard/DrawningObjects/DrawningMonorail.java @@ -2,6 +2,7 @@ package MonorailHard.DrawningObjects; import MonorailHard.DirectionType; import MonorailHard.Entities.EntityMonorail; +import MonorailHard.MovementStrategy.DrawningObjectMonorail; import MonorailHard.MovementStrategy.IMoveableObject; import com.sun.source.tree.ImportTree; @@ -12,8 +13,8 @@ import java.util.Random; public class DrawningMonorail { protected EntityMonorail EntityMonorail; - private int _pictureWidth; - private int _pictureHeight; + public int _pictureWidth; + public int _pictureHeight; protected int _startPosX; protected int _startPosY; protected int _monorailWidth = 133; @@ -78,6 +79,8 @@ public class DrawningMonorail { return; _startPosX = x; _startPosY = y; + DrawningWheels.ChangeX(_startPosX); + DrawningWheels.ChangeY(_startPosY); if(x + _monorailWidth >= _pictureWidth|| y + _monorailHeight >= _pictureHeight || x < 0 || y < 0){ _startPosX = 0; _startPosY = 0; @@ -111,7 +114,9 @@ public class DrawningMonorail { return can; } - + public IMoveableObject GetMoveableObject(){ + return new DrawningObjectMonorail(this); + } public void MoveTransport(DirectionType direction){ if (!CanMove(direction) || EntityMonorail == null) diff --git a/src/MonorailHard/FormMonorail.java b/src/MonorailHard/FormMonorail.java index 062ff95..f245845 100644 --- a/src/MonorailHard/FormMonorail.java +++ b/src/MonorailHard/FormMonorail.java @@ -3,6 +3,7 @@ package MonorailHard; import MonorailHard.DrawningObjects.DrawningLocomotive; import MonorailHard.DrawningObjects.DrawningMonorail; import MonorailHard.MovementStrategy.*; +import org.w3c.dom.ranges.DocumentRange; import javax.swing.*; import javax.swing.text.AbstractDocument; @@ -11,22 +12,41 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; + public class FormMonorail{ + private DrawningMonorail DrawningMonorail; private AbstractStrategy _abstractStrategy; + + public JButton buttonSelect; + + public JFrame MonorailFrame; + Canvas canv; static int pictureBoxWidth = 882; static int pictureBoxHeight = 453; + public Color ChooseColor(JFrame MonorailFrame){ + JColorChooser dialog = new JColorChooser(); + Color res = JColorChooser.showDialog(MonorailFrame, "Выберите цвет", Color.WHITE); + return res; + } + + public DrawningMonorail SelectedMonorail(){ + return DrawningMonorail; + } public void Draw(){ + if(DrawningMonorail == null) + return; canv.repaint(); } public FormMonorail(){ - JFrame MonorailFrame =new JFrame (); + MonorailFrame =new JFrame (); JButton buttonCreate = new JButton("Создать"); JButton buttonCreateLocomotive = new JButton("Создать локомотив"); JButton buttonStep = new JButton("Шаг"); + buttonSelect = new JButton ("Выбрать"); JComboBox comboBoxStrategy = new JComboBox( new String[]{ "Довести до центра", @@ -89,8 +109,13 @@ public class FormMonorail{ @Override public void actionPerformed(ActionEvent e) { Random random = new Random(); + Color color = new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)); + Color choosen = ChooseColor(MonorailFrame); + if(choosen != null){ + color = choosen; + } DrawningMonorail = new DrawningMonorail(random.nextInt(100, 300), random.nextDouble(1000, 3000), - Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), + color, Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), pictureBoxWidth, pictureBoxHeight); @@ -104,19 +129,30 @@ public class FormMonorail{ new ActionListener() { public void actionPerformed(ActionEvent e){ Random random = new Random(); + Color color = new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)); + Color additionalColor = new Color(random.nextInt(0, 256), random.nextInt(0, 256), random.nextInt(0, 256)); + Color choosen = ChooseColor(MonorailFrame); + if(choosen != null){ + color = choosen; + } + choosen = ChooseColor(MonorailFrame); + if(choosen != null){ + additionalColor = choosen; + } DrawningMonorail = new DrawningLocomotive(random.nextInt(100, 300), random.nextDouble(1000, 3000), - Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), + color, Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301)), random.nextInt(1, 6), pictureBoxWidth, pictureBoxHeight, random.nextBoolean(), random.nextBoolean(), - Color.getHSBColor(random.nextInt(0, 301), random.nextInt(0, 301), random.nextInt(0, 301))); + additionalColor); canv.DrawningMonorail = DrawningMonorail; comboBoxStrategy.enable(true); Draw(); } } ); + RightButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { @@ -156,10 +192,11 @@ public class FormMonorail{ }); MonorailFrame.setSize (900, 500); - MonorailFrame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); + MonorailFrame.setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE); MonorailFrame.setLayout(null); canv = new Canvas(); canv.setSize(pictureBoxWidth, pictureBoxHeight); + buttonSelect.setBounds(383,401, 180, 40); buttonCreate.setBounds(198, 401, 180, 40); buttonCreateLocomotive.setBounds(12, 401, 180, 40); RightButton.setBounds(840,411,30,30); @@ -177,6 +214,7 @@ public class FormMonorail{ MonorailFrame.add(RightButton); MonorailFrame.add(comboBoxStrategy); MonorailFrame.add(buttonStep); + MonorailFrame.add(buttonSelect); MonorailFrame.setVisible(true); } } diff --git a/src/MonorailHard/FormMonorailCollection.java b/src/MonorailHard/FormMonorailCollection.java new file mode 100644 index 0000000..d6dc7f6 --- /dev/null +++ b/src/MonorailHard/FormMonorailCollection.java @@ -0,0 +1,129 @@ +package MonorailHard; + +import MonorailHard.DrawningObjects.DrawningMonorail; +import MonorailHard.Generics.MonorailGenericCollection; +import MonorailHard.MovementStrategy.DrawningObjectMonorail; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.text.Normalizer; + + +public class FormMonorailCollection { + private final MonorailGenericCollection _monorails; + private int pictureBoxWidth = 605; + private int pictureBoxHeight = 426; + + CollectionCanvas canv; + + void Draw(){ + if(canv == null) + return; + canv.repaint(); + } + + public FormMonorailCollection(){ + _monorails = new MonorailGenericCollection<>(pictureBoxWidth, pictureBoxHeight); + canv = new CollectionCanvas(); + JPanel toolBox = new JPanel(); + JFrame collectionFrame = new JFrame(); + collectionFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + collectionFrame.setSize(880,497); + toolBox.setBounds(623, 12, 227, 426); + canv.setBounds(12,12,pictureBoxWidth,pictureBoxHeight); + JButton addButton = new JButton("Добавить"); + JButton removeButton = new JButton("Удалить"); + JButton refreshButton = new JButton("Обновить"); + JTextField monorailNumb = new JTextField(); + GridLayout lay = new GridLayout(4,1); + toolBox.setLayout(lay); + toolBox.add(addButton); + toolBox.add(monorailNumb); + toolBox.add(removeButton); + toolBox.add(refreshButton); + collectionFrame.add(toolBox); + collectionFrame.add(canv); + collectionFrame.setVisible(true); + + addButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if(_monorails == null) { + return; + } + FormMonorail form = new FormMonorail(); + form.buttonSelect.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if (_monorails.Insert(form.SelectedMonorail()) != -1) + { + JOptionPane.showMessageDialog(null, "Объект добавлен", "Информация", JOptionPane.INFORMATION_MESSAGE); + form.SelectedMonorail()._pictureWidth = pictureBoxWidth; + form.SelectedMonorail()._pictureHeight = pictureBoxHeight; + Draw(); + } + else + { + JOptionPane.showMessageDialog(null, "Не удалось добавить объект", "Информация", JOptionPane.INFORMATION_MESSAGE); + } + canv._monorails = _monorails; + form.MonorailFrame.dispose(); + Draw(); + } + }); + } + }); + removeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if(_monorails == null) { + return; + } + String tmp = monorailNumb.getText(); + int numb; + + try{ + numb = Integer.parseInt(tmp); + } + catch(Exception ex){ + JOptionPane.showMessageDialog(null, "Введите число", "Информация", JOptionPane.INFORMATION_MESSAGE); + return; + } + _monorails.Remove(numb); + _monorails.ShowMonorails(); + JOptionPane.showMessageDialog(null, "Объект удален", "Информация", JOptionPane.INFORMATION_MESSAGE); + Draw(); + } + }); + + refreshButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + if(_monorails == null) { + return; + } + _monorails.ShowMonorails(); + Draw(); + } + }); + } +} + +class CollectionCanvas extends JComponent { + public MonorailGenericCollection _monorails; + + public CollectionCanvas(){ + } + @Override + public void paintComponent (Graphics g){ + if (_monorails == null){ + return; + } + super.paintComponents (g) ; + Graphics2D g2d = (Graphics2D)g; + g2d.drawImage(_monorails.ShowMonorails(), 0, 0, this); + super.repaint(); + } +} diff --git a/src/MonorailHard/Generics/HardGeneric.java b/src/MonorailHard/Generics/HardGeneric.java new file mode 100644 index 0000000..f4643d1 --- /dev/null +++ b/src/MonorailHard/Generics/HardGeneric.java @@ -0,0 +1,61 @@ +package MonorailHard.Generics; + +import MonorailHard.DrawningObjects.DrawningMonorail; +import MonorailHard.DrawningObjects.IDraw; +import MonorailHard.Entities.EntityMonorail; + +import java.util.Random; + +public class HardGeneric { + T[] arrFirst; + U[] arrSecond; + + private int curSz; + private int CountFirst; + private int CountSecond; + + private int pictureBoxWidth; + + private int pictureBoxHeight; + + public HardGeneric(int countFirst, int countSecond, int width, int height){ + curSz = 0; + CountFirst = countFirst; + CountSecond = countSecond; + arrFirst = (T[]) new EntityMonorail[CountFirst]; + arrSecond = (U[]) new IDraw[CountSecond]; + pictureBoxHeight = height; + pictureBoxWidth = width; + } + + public int InsertFirst(T entityMonorail){ + if(arrFirst[CountFirst-1] != null) + return -1; + for(int i = curSz -1; i>= 0; i--) { + arrFirst[i + 1] = arrFirst[i]; + arrSecond[i + 1] = arrSecond[i]; + } + curSz++; + arrFirst[0] = entityMonorail; + + return 0; + } + + public int InsertSecond(U inter){ + if(arrSecond[CountSecond-1] != null) + return -1; + arrSecond[0] = inter; + return 0; + } + + public DrawningMonorail MakeObject(){ + Random rand = new Random(); + int indFirst = rand.nextInt(0, curSz); + int indSecond = rand.nextInt(0,curSz); + EntityMonorail entity = arrFirst[indFirst]; + IDraw inter = arrSecond[indSecond]; + DrawningMonorail monorail = new DrawningMonorail(entity.Speed(), entity.Weight(), entity.BodyColor(), + entity.WheelColor(), entity.TireColor(), pictureBoxWidth, pictureBoxHeight); + return monorail; + } +} diff --git a/src/MonorailHard/Generics/MonorailGenericCollection.java b/src/MonorailHard/Generics/MonorailGenericCollection.java new file mode 100644 index 0000000..c693d8c --- /dev/null +++ b/src/MonorailHard/Generics/MonorailGenericCollection.java @@ -0,0 +1,84 @@ +package MonorailHard.Generics; + +import MonorailHard.DrawningObjects.DrawningMonorail; +import MonorailHard.MovementStrategy.IMoveableObject; + +import java.awt.*; +import java.awt.image.BufferedImage; + +public class MonorailGenericCollection { + private final int _pictureWidth; + + private final int _pictureHeight; + + private final int _placeSizeWidth = 133; + + private final int _placeSizeHeight = 50; + + private final SetGeneric _collection; + + public MonorailGenericCollection(int picWidth, int picHeight){ + int width = picWidth / _placeSizeWidth; + int height = picHeight / _placeSizeHeight; + _pictureWidth = picWidth; + _pictureHeight = picHeight; + _collection = new SetGeneric(width * height); + } + + public int Insert(T obj){ + if (obj == null) + { + return -1; + } + return _collection.Insert(obj); + } + + public boolean Remove(int position){ + return _collection.Remove(position); + } + public U GetU(int pos){ + T ans = _collection.Get(pos); + if(ans == null) + return null; + return (U)ans.GetMoveableObject(); + } + + private void DrawBackground(Graphics g) + { + g.setColor(Color.BLACK); + for (int i = 0; i < _pictureWidth / _placeSizeWidth; i++) + { + for (int j = 0; j < _pictureHeight / _placeSizeHeight + + 1; ++j) + { + g.drawLine(i * _placeSizeWidth, j * + _placeSizeHeight, i * _placeSizeWidth + _placeSizeWidth / 2, j * + _placeSizeHeight); + } + g.drawLine(i * _placeSizeWidth, 0, i * + _placeSizeWidth, _pictureHeight / _placeSizeHeight * _placeSizeHeight); + } + } + + private void DrawObjects(Graphics g) + { + for (int i = 0; i < _collection.Count; i++) + { + DrawningMonorail monorail = _collection.Get(i); + if (monorail != null) + { + int inRow = _pictureWidth / _placeSizeWidth; + monorail.SetPosition(i % inRow * _placeSizeWidth, (_collection.Count / inRow - 1 - i / inRow) * _placeSizeHeight ); + monorail.DrawMonorail((Graphics2D) g); + } + } + } + public BufferedImage ShowMonorails() + { + BufferedImage bmp = new BufferedImage(_pictureWidth, _pictureHeight, BufferedImage.TYPE_4BYTE_ABGR); + Graphics gr = bmp.createGraphics(); + DrawBackground(gr); + DrawObjects(gr); + return bmp; + } +} diff --git a/src/MonorailHard/Generics/SetGeneric.java b/src/MonorailHard/Generics/SetGeneric.java new file mode 100644 index 0000000..2e382d1 --- /dev/null +++ b/src/MonorailHard/Generics/SetGeneric.java @@ -0,0 +1,53 @@ +package MonorailHard.Generics; + +public class SetGeneric { + private final Object[] _places; + + public int Count; + + public SetGeneric(int count){ + _places = new Object[count]; + Count = count; + } + + public int Insert(T monorail){ + return Insert(monorail, 0); + } + + public int Insert(T monorail, int position){ + if(!(position >= 0 && position < Count)) + return -1; + if(_places[position] == null){ + _places[position] = monorail; + } + else{ + int place = -1; + for(int i = position; i < Count; i++){ + if(_places[i] == null){ + place = i; + break; + } + } + if(place == -1) + return -1; + + for(int i = place - 1; i >= position; i--) + _places[i+1] = _places[i]; + _places[position] = monorail; + } + return position; + } + + public boolean Remove(int position){ + if(!(position >= 0 && position < Count)) + return false; + _places[position] = null; + return true; + } + + public T Get(int position){ + if(!(position >= 0 && position < Count)) + return null; + return (T)_places[position]; + } +} diff --git a/src/MonorailHard/HardForm.java b/src/MonorailHard/HardForm.java new file mode 100644 index 0000000..1072ee5 --- /dev/null +++ b/src/MonorailHard/HardForm.java @@ -0,0 +1,77 @@ +package MonorailHard; + +import MonorailHard.DrawningObjects.DrawningMonorail; +import MonorailHard.DrawningObjects.DrawningWheels; +import MonorailHard.DrawningObjects.IDraw; +import MonorailHard.Entities.EntityMonorail; +import MonorailHard.Generics.HardGeneric; + +import javax.swing.*; +import javax.swing.text.html.parser.Entity; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.Random; + +public class HardForm { + private Canvas canv; + + private int pictureBoxWidth; + private int pictureBoxHeight; + + private EntityMonorail makeEntity(){ + Random rand = new Random(); + return new EntityMonorail(rand.nextInt(100, 300), rand.nextDouble(1000,3000), + Color.getHSBColor(rand.nextInt(0, 301), rand.nextInt(0, 301), rand.nextInt(0, 301)), + Color.getHSBColor(rand.nextInt(0, 301), rand.nextInt(0, 301), rand.nextInt(0, 301)), + Color.getHSBColor(rand.nextInt(0, 301), rand.nextInt(0, 301), rand.nextInt(0, 301))); + } + void Draw(){ + if(canv == null) + return; + canv.repaint(); + } + private IDraw makeIDraw(EntityMonorail entity){ + Random rand = new Random(); + return new DrawningWheels(pictureBoxWidth, pictureBoxHeight, 0, 0, entity.WheelColor(), entity.TireColor()); + } + public HardForm(){ + Random rand = new Random(); + int sz = rand.nextInt(1, 10); + + + JFrame HardFrame = new JFrame(); + HardFrame.setSize(700, 400); + HardFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + canv = new Canvas(); + canv.setBounds(0,0,pictureBoxWidth,pictureBoxHeight); + JButton makeObject = new JButton("Создать"); + makeObject.setBounds(0, 0, 100, 40); + canv.add(makeObject); + HardFrame.setContentPane(canv); + HardFrame.setVisible(true); + pictureBoxHeight = canv.getHeight(); + pictureBoxWidth = canv.getWidth(); + HardGeneric toDraw= new HardGeneric<>(sz, + sz, pictureBoxWidth, pictureBoxHeight); + for(int i = 0; i < sz; i++){ + EntityMonorail ent = makeEntity(); + toDraw.InsertFirst(ent); + toDraw.InsertSecond(makeIDraw(ent)); + } + makeObject.addActionListener( + new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + DrawningMonorail DrawningMonorail = toDraw.MakeObject(); + DrawningMonorail.SetPosition(pictureBoxWidth / 2 - DrawningMonorail.GetWidth()/2, + pictureBoxHeight / 2 - DrawningMonorail.GetHeight()/2); + canv.DrawningMonorail = DrawningMonorail; + Draw(); + } + } + ); + + } +} + diff --git a/src/MonorailHard/Main.java b/src/MonorailHard/Main.java index 1191b22..965237d 100644 --- a/src/MonorailHard/Main.java +++ b/src/MonorailHard/Main.java @@ -15,6 +15,6 @@ import javax.swing.*; public class Main { public static void main(String[] args) throws IOException { - FormMonorail form = new FormMonorail(); + FormMonorailCollection form = new FormMonorailCollection(); } }