diff --git a/.idea/misc.xml b/.idea/misc.xml
index 1acf042..d4658b0 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/src/PlaneHard/FormPlaneConfig.java b/src/PlaneHard/FormPlaneConfig.java
new file mode 100644
index 0000000..9789e6b
--- /dev/null
+++ b/src/PlaneHard/FormPlaneConfig.java
@@ -0,0 +1,390 @@
+package PlaneHard;
+
+import java.awt.*;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import javax.swing.*;
+import java.awt.event.*;
+import java.io.IOException;
+
+import drawing_objects.*;
+
+public class FormPlaneConfig extends JFrame {
+ private static class LabelTransferHandler extends TransferHandler {
+ @Override
+ public int getSourceActions(JComponent c) {
+ return TransferHandler.COPY;
+ }
+ @Override
+ protected Transferable createTransferable(JComponent c) {
+ return new StringSelection(((JLabel)c).getText());
+ }
+ }
+ private record ColorTransferable(Color color) implements Transferable {
+ private static final DataFlavor colorDataFlavor = new DataFlavor(Color.class, "Color");
+ @Override
+ public DataFlavor[] getTransferDataFlavors() {
+ return new DataFlavor[]{colorDataFlavor};
+ }
+ @Override
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ return colorDataFlavor.equals(flavor);
+ }
+ @Override
+ public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
+ if (isDataFlavorSupported(flavor)) {
+ return color;
+ } else {
+ throw new UnsupportedFlavorException(flavor);
+ }
+ }
+ }
+ private record IDrawEnginesTransferable(IDrawEngines IDrawEnginesObject) implements Transferable {
+ private static final DataFlavor IDrawEnginesDataFlavor = new DataFlavor(IDrawEngines.class, "IDrawEngines");
+ @Override
+ public DataFlavor[] getTransferDataFlavors() {
+ return new DataFlavor[]{IDrawEnginesDataFlavor};
+ }
+ @Override
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ return IDrawEnginesDataFlavor.equals(flavor);
+ }
+ @Override
+ public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {
+ if (isDataFlavorSupported(flavor)) {
+ return IDrawEnginesObject;
+ } else {
+ throw new UnsupportedFlavorException(flavor);
+ }
+ }
+ }
+ private static class PanelTransferHandler extends TransferHandler {
+ @Override
+ public int getSourceActions(JComponent c) {
+ return TransferHandler.COPY;
+ }
+ @Override
+ protected Transferable createTransferable(JComponent c) {
+ return new ColorTransferable(c.getBackground());
+ }
+ }
+ private static class LabelMouseAdapter extends MouseAdapter{
+ @Override
+ public void mousePressed(MouseEvent e) {
+ ((JLabel)e.getComponent()).getTransferHandler().exportAsDrag(((JLabel)e.getComponent()), e, TransferHandler.COPY);
+ }
+ }
+ private static class PanelMouseAdapter extends MouseAdapter{
+ @Override
+ public void mousePressed(MouseEvent e) {
+ ((JPanel)e.getComponent()).getTransferHandler().exportAsDrag(((JPanel)e.getComponent()), e, TransferHandler.COPY);
+ }
+ }
+ private static class IDrawEnginesComponent extends JComponent{
+ public IDrawEngines obj;
+ public IDrawEnginesComponent(IDrawEngines obj){
+ this.obj = obj;
+ this.addMouseListener(
+ new MouseAdapter(){
+ @Override
+ public void mousePressed(MouseEvent e) {
+ ((IDrawEnginesComponent)e.getComponent()).getTransferHandler().exportAsDrag(((IDrawEnginesComponent)e.getComponent()), e, TransferHandler.COPY);
+ }
+ }
+ );
+ this.setTransferHandler(
+ new TransferHandler(){
+ @Override
+ public int getSourceActions(JComponent c) {
+ return TransferHandler.COPY;
+ }
+
+ @Override
+ protected Transferable createTransferable(JComponent c) {
+ return new IDrawEnginesTransferable(((IDrawEnginesComponent) c).obj);
+ }
+ }
+ );
+ }
+ }
+ private final JComponent pictureBox = new JComponent(){
+ public void paintComponent(Graphics graphics){
+ super.paintComponent(graphics);
+ Graphics2D graphics2D = (Graphics2D) graphics;
+ if (drawingPlane != null) drawingPlane.drawTransport(graphics2D);
+ super.repaint();
+ }
+ };
+ public final JButton addButton = new JButton("Добавить");
+ public final JButton cancelButton = new JButton("Отмена");
+ public DrawingPlane drawingPlane;
+ private final int pictureBoxWidth = 218;
+ private final int pictureBoxHeight = 178;
+ public FormPlaneConfig(){
+ super("Создание объекта");
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+ createGui();
+ setVisible(true);
+ }
+ private void createGui(){
+ pictureBox.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
+ IDrawEnginesComponent engines = new IDrawEnginesComponent(new DrawingEnginesNotRounded());
+ IDrawEnginesComponent enginesRoundBack = new IDrawEnginesComponent(new DrawingEnginesRoundedBack());
+ IDrawEnginesComponent enginesRoundFront = new IDrawEnginesComponent(new DrawingEnginesRoundedFront());
+ JLabel squareLabel = new JLabel("Квадратные");
+ squareLabel.setHorizontalAlignment(SwingConstants.CENTER);
+ squareLabel.setVerticalAlignment(SwingConstants.CENTER);
+ JLabel roundLabel = new JLabel("Круглые сзади");
+ roundLabel.setHorizontalAlignment(SwingConstants.CENTER);
+ roundLabel.setVerticalAlignment(SwingConstants.CENTER);
+ JLabel crossLabel = new JLabel("Круглые спереди");
+ crossLabel.setHorizontalAlignment(SwingConstants.CENTER);
+ crossLabel.setVerticalAlignment(SwingConstants.CENTER);
+ engines.setLayout(new GridLayout(1,1));
+ enginesRoundBack.setLayout(new GridLayout(1,1));
+ enginesRoundFront.setLayout(new GridLayout(1,1));
+ engines.add(squareLabel);
+ enginesRoundBack.add(roundLabel);
+ enginesRoundFront.add(crossLabel);
+ engines.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
+ enginesRoundBack.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
+ enginesRoundFront.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
+ JLabel colorLabel = new JLabel("Цвет");
+ colorLabel.setHorizontalAlignment(SwingConstants.CENTER);
+ colorLabel.setVerticalAlignment(SwingConstants.CENTER);
+ colorLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
+ JLabel additionalColorLabel = new JLabel("Доп цвет");
+ additionalColorLabel.setHorizontalAlignment(SwingConstants.CENTER);
+ additionalColorLabel.setVerticalAlignment(SwingConstants.CENTER);
+ additionalColorLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
+ JLabel IDrawEnginesLabel = new JLabel("Двигатели");
+ IDrawEnginesLabel.setHorizontalAlignment(SwingConstants.CENTER);
+ IDrawEnginesLabel.setVerticalAlignment(SwingConstants.CENTER);
+ IDrawEnginesLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
+ JCheckBox checkBoxBomb = new JCheckBox("Наличие бомб");
+ JCheckBox checkBoxFuel = new JCheckBox("Наличие баков");
+ JLabel simpleLabel = new JLabel("Простой");
+ simpleLabel.setTransferHandler(new LabelTransferHandler());
+ simpleLabel.addMouseListener(new LabelMouseAdapter());
+ simpleLabel.setHorizontalAlignment(SwingConstants.CENTER);
+ simpleLabel.setVerticalAlignment(SwingConstants.CENTER);
+ simpleLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
+ JLabel advancedLabel = new JLabel("Продвинутый");
+ advancedLabel.setTransferHandler(new LabelTransferHandler());
+ advancedLabel.addMouseListener(new LabelMouseAdapter());
+ advancedLabel.setHorizontalAlignment(SwingConstants.CENTER);
+ advancedLabel.setVerticalAlignment(SwingConstants.CENTER);
+ advancedLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
+ JLabel speedLabel = new JLabel ("Скорость");
+ JLabel weightLabel = new JLabel ("Вес");
+ SpinnerNumberModel speedSpinnerModel = new SpinnerNumberModel(100.0, 100.0, 1000.0, 1.0);
+ SpinnerNumberModel weightSpinnerModel = new SpinnerNumberModel(100.0, 100.0, 1000.0, 1.0);
+ SpinnerNumberModel enginesNumberSpinnerModel = new SpinnerNumberModel(2, 2, 6, 2.0);
+ JSpinner speedSpinner = new JSpinner(speedSpinnerModel);
+ JSpinner weightSpinner = new JSpinner(weightSpinnerModel);
+ JSpinner enginesNumberSpinner = new JSpinner(enginesNumberSpinnerModel);
+ JPanel colorPanel = new JPanel();
+ JPanel redPanel = new JPanel();
+ JPanel greenPanel = new JPanel();
+ JPanel bluePanel = new JPanel();
+ JPanel yellowPanel = new JPanel();
+ JPanel whitePanel = new JPanel();
+ JPanel grayPanel = new JPanel();
+ JPanel blackPanel = new JPanel();
+ JPanel purplePanel = new JPanel();
+ redPanel.setTransferHandler(new PanelTransferHandler());
+ greenPanel.setTransferHandler(new PanelTransferHandler());
+ bluePanel.setTransferHandler(new PanelTransferHandler());
+ yellowPanel.setTransferHandler(new PanelTransferHandler());
+ whitePanel.setTransferHandler(new PanelTransferHandler());
+ grayPanel.setTransferHandler(new PanelTransferHandler());
+ blackPanel.setTransferHandler(new PanelTransferHandler());
+ purplePanel.setTransferHandler(new PanelTransferHandler());
+ redPanel.addMouseListener(new PanelMouseAdapter());
+ greenPanel.addMouseListener(new PanelMouseAdapter());
+ bluePanel.addMouseListener(new PanelMouseAdapter());
+ yellowPanel.addMouseListener(new PanelMouseAdapter());
+ whitePanel.addMouseListener(new PanelMouseAdapter());
+ grayPanel.addMouseListener(new PanelMouseAdapter());
+ blackPanel.addMouseListener(new PanelMouseAdapter());
+ purplePanel.addMouseListener(new PanelMouseAdapter());
+ redPanel.setName("Красный");
+ greenPanel.setName("Зелёный");
+ bluePanel.setName("Синий");
+ yellowPanel.setName("Жёлтый");
+ whitePanel.setName("Белый");
+ grayPanel.setName("Серый");
+ blackPanel.setName("Чёрный");
+ purplePanel.setName("Фиолетовый");
+ pictureBox.setTransferHandler(
+ new TransferHandler(){
+ @Override
+ public boolean canImport(TransferHandler.TransferSupport support) {
+ return support.isDataFlavorSupported(DataFlavor.stringFlavor);
+ }
+ @Override
+ public boolean importData(TransferHandler.TransferSupport support) {
+ if (canImport(support)) {
+ try {
+ int speed = ((Number)speedSpinner.getValue()).intValue();
+ int weight = ((Number)weightSpinner.getValue()).intValue();
+ int enginesNumber = ((Number)enginesNumberSpinner.getValue()).intValue();
+ switch ((String)support.getTransferable().getTransferData(DataFlavor.stringFlavor)) {
+ case "Простой" -> {
+ drawingPlane = new DrawingPlane(speed, weight, Color.WHITE,
+ pictureBoxWidth, pictureBoxHeight, 0, enginesNumber);
+ drawingPlane.ChangeEnginesCol(enginesNumber);
+ }
+ case "Продвинутый" -> {
+ drawingPlane = new DrawingAirBomber(speed, weight, Color.WHITE, Color.BLACK,
+ checkBoxBomb.isSelected(), checkBoxFuel.isSelected(),
+ pictureBoxWidth, pictureBoxHeight, 0, enginesNumber);
+ drawingPlane.ChangeEnginesCol(enginesNumber);
+ }
+ }
+ drawingPlane.setPosition(pictureBoxWidth / 2 - drawingPlane.getWidth() / 2,
+ pictureBoxHeight / 2 - drawingPlane.getHeight() / 2);
+ pictureBox.repaint();
+ return true;
+ } catch (UnsupportedFlavorException | IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return false;
+ }
+ }
+ );
+ IDrawEnginesLabel.setTransferHandler(
+ new TransferHandler(){
+ @Override
+ public boolean canImport(TransferHandler.TransferSupport support) {
+ return support.isDataFlavorSupported(IDrawEnginesTransferable.IDrawEnginesDataFlavor);
+ }
+ @Override
+ public boolean importData(TransferHandler.TransferSupport support) {
+ if (canImport(support)) {
+ try {
+ IDrawEngines obj = (IDrawEngines) support.getTransferable().getTransferData(IDrawEnginesTransferable.IDrawEnginesDataFlavor);
+ obj.setNumber(((Number)enginesNumberSpinner.getValue()).intValue());
+ if (drawingPlane == null)
+ return false;
+ drawingPlane.ChangeIDraw(obj);
+ pictureBox.repaint();
+ return true;
+ } catch (UnsupportedFlavorException | IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return false;
+ }
+ }
+ );
+ colorLabel.setTransferHandler(
+ new TransferHandler(){
+ @Override
+ public boolean canImport(TransferHandler.TransferSupport support) {
+ return support.isDataFlavorSupported(ColorTransferable.colorDataFlavor);
+ }
+ @Override
+ public boolean importData(TransferHandler.TransferSupport support) {
+ if (canImport(support)) {
+ try {
+ Color color = (Color) support.getTransferable().getTransferData(ColorTransferable.colorDataFlavor);
+ if (drawingPlane == null)
+ return false;
+ drawingPlane.ChangeColor(color);
+ pictureBox.repaint();
+ return true;
+ } catch (UnsupportedFlavorException | IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return false;
+ }
+ }
+ );
+ additionalColorLabel.setTransferHandler(
+ new TransferHandler(){
+ @Override
+ public boolean canImport(TransferHandler.TransferSupport support) {
+ return support.isDataFlavorSupported(ColorTransferable.colorDataFlavor);
+ }
+ @Override
+ public boolean importData(TransferHandler.TransferSupport support) {
+ if (canImport(support)) {
+ try {
+ Color color = (Color) support.getTransferable().getTransferData(ColorTransferable.colorDataFlavor);
+ if (drawingPlane == null || !(drawingPlane instanceof DrawingAirBomber))
+ return false;
+ ((DrawingAirBomber) drawingPlane).ChangeAddColor(color);
+ pictureBox.repaint();
+ return true;
+ } catch (UnsupportedFlavorException | IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return false;
+ }
+ }
+ );
+ addButton.setBounds(555,250,94,29);
+ cancelButton.setBounds(679,250,94,29);
+ pictureBox.setBounds(555, 65, pictureBoxWidth, pictureBoxHeight);
+ colorLabel.setBounds(555, 20, 70, 33);
+ additionalColorLabel.setBounds(629, 20, 70, 33);
+ IDrawEnginesLabel.setBounds(703, 20, 70, 33);
+ checkBoxBomb.setBounds(6, 132, 159, 24);
+ checkBoxFuel.setBounds(6, 162, 145, 24);
+ simpleLabel.setBounds(171,169, 120, 50);
+ advancedLabel.setBounds(297,169, 120, 50);
+ engines.setBounds(171,229, 120, 50);
+ enginesRoundBack.setBounds(297,229, 120, 50);
+ enginesRoundFront.setBounds(423,229, 120, 50);
+ colorPanel.setBounds(171, 23, 372,143);
+ speedSpinner.setBounds(6, 46, 150, 27);
+ speedLabel.setBounds(6, 23, 73, 20);
+ weightSpinner.setBounds(6, 99, 150, 27);
+ weightLabel.setBounds(6, 76, 33, 20);
+ enginesNumberSpinner.setBounds(6, 200, 150, 27);
+ redPanel.setBackground(Color.RED);
+ greenPanel.setBackground(Color.GREEN);
+ bluePanel.setBackground(Color.BLUE);
+ yellowPanel.setBackground(Color.YELLOW);
+ whitePanel.setBackground(Color.WHITE);
+ grayPanel.setBackground(Color.GRAY);
+ blackPanel.setBackground(Color.BLACK);
+ purplePanel.setBackground(Color.MAGENTA);
+ colorPanel.setLayout(new GridLayout(2, 4, 26, 10));
+ colorPanel.add(redPanel);
+ colorPanel.add(greenPanel);
+ colorPanel.add(bluePanel);
+ colorPanel.add(yellowPanel);
+ colorPanel.add(whitePanel);
+ colorPanel.add(grayPanel);
+ colorPanel.add(blackPanel);
+ colorPanel.add(purplePanel);
+ add(colorLabel);
+ add(additionalColorLabel);
+ add(IDrawEnginesLabel);
+ setLayout(null);
+ setSize(818, 350);
+ add(speedLabel);
+ add(speedSpinner);
+ add(weightLabel);
+ add(weightSpinner);
+ add(simpleLabel);
+ add(advancedLabel);
+ add(checkBoxBomb);
+ add(checkBoxFuel);
+ add(pictureBox);
+ add(addButton);
+ add(cancelButton);
+ add(enginesNumberSpinner);
+ add(colorPanel);
+ add(engines);
+ add(enginesRoundBack);
+ add(enginesRoundFront);
+ }
+}
\ No newline at end of file
diff --git a/src/drawing_objects/DrawingAirBomber.java b/src/drawing_objects/DrawingAirBomber.java
index e10a273..a112ed5 100644
--- a/src/drawing_objects/DrawingAirBomber.java
+++ b/src/drawing_objects/DrawingAirBomber.java
@@ -13,6 +13,9 @@ public class DrawingAirBomber extends DrawingPlane {
entityPlane = new EntityAirBomber(speed, weight, bodyColor, additionalColor,bombs, fuel);
}
+ public void ChangeAddColor(Color col){
+ ((EntityAirBomber)entityPlane).additionalColor = col;
+ }
public void drawTransport(Graphics2D g)
{
if (!(entityPlane instanceof EntityAirBomber))
diff --git a/src/drawing_objects/DrawingPlane.java b/src/drawing_objects/DrawingPlane.java
index 84bd624..a2485db 100644
--- a/src/drawing_objects/DrawingPlane.java
+++ b/src/drawing_objects/DrawingPlane.java
@@ -14,8 +14,8 @@ public class DrawingPlane {
return entityPlane;
}
private IDrawEngines drawingEngines;
- private int pictureWidth;
- private int pictureHeight;
+ public int pictureWidth;
+ public int pictureHeight;
protected int startPosX;
public int getPosX(){return startPosX;}
protected int startPosY;
@@ -24,6 +24,7 @@ public class DrawingPlane {
public int getWidth(){return PLANE_WIDTH;}
private final int PLANE_HEIGHT = 160;
public int getHeight(){return PLANE_HEIGHT;}
+
public DrawingPlane(int speed, double weight, Color bodyColor, int width, int height, int enginesType, int enginesNumber) {
if (width < PLANE_WIDTH || height < PLANE_HEIGHT)
return;
@@ -140,4 +141,16 @@ public class DrawingPlane {
break;
}
}
+
+ public void ChangeColor(Color col){
+ entityPlane.bodyColor = col;
+ }
+
+ public void ChangeIDraw(IDrawEngines obj){
+ drawingEngines = obj;
+ }
+
+ public void ChangeEnginesCol(int col){
+ drawingEngines.setNumber(col);
+ }
}
diff --git a/src/entities/EntityAirBomber.java b/src/entities/EntityAirBomber.java
index 11ead45..95be310 100644
--- a/src/entities/EntityAirBomber.java
+++ b/src/entities/EntityAirBomber.java
@@ -3,7 +3,7 @@ package entities;
import java.awt.*;
public class EntityAirBomber extends EntityPlane {
- private Color additionalColor;
+ public Color additionalColor;
public Color getAdditionalColor(){
return additionalColor;
}
diff --git a/src/entities/EntityPlane.java b/src/entities/EntityPlane.java
index 98da4a8..a990ec3 100644
--- a/src/entities/EntityPlane.java
+++ b/src/entities/EntityPlane.java
@@ -11,7 +11,7 @@ public class EntityPlane {
public double getWeight() {
return weight;
}
- private Color bodyColor;
+ public Color bodyColor;
public Color getBodyColor() {
return bodyColor;
}
diff --git a/src/form/FramePlaneCollection.java b/src/form/FramePlaneCollection.java
index 990404f..6913822 100644
--- a/src/form/FramePlaneCollection.java
+++ b/src/form/FramePlaneCollection.java
@@ -5,7 +5,10 @@ import javax.swing.border.StrokeBorder;
import Generics.PlaneGenericStorage;
import Generics.PlaneTrashCollection;
+import Generics.PlanesGenericCollection;
+import PlaneHard.FormPlaneConfig;
import drawing_objects.DrawingPlane;
+import movement_strategy.DrawingObjectPlane;
import java.awt.*;
import java.io.IOException;
@@ -142,30 +145,25 @@ public class FramePlaneCollection extends JFrame {
storage.DelSet(listStorages.getSelectedValue());
reloadObjects();
}
- private void buttonAddPlaneClick() {
- if (listStorages.getSelectedIndex() == -1)
+ public void buttonAddPlaneClick() {
+ if(listStorages.getSelectedIndex() == -1) {
return;
- var obj = storage.getCollection(listStorages.getSelectedValue());
- if (obj == null)
- return;
- FrameAirBomber form;
- try {
- form = new FrameAirBomber();
- } catch (IOException e) {
- throw new RuntimeException(e);
}
- form.selectPlaneButton.addActionListener(e->{
- form.select();
- DrawingPlane plane = form.getSelectedPlane();
- form.dispose();
- if (obj.Insert(plane)) {
- JOptionPane.showMessageDialog(this, "Объект добавлен");
+ PlanesGenericCollection drawingPlanes = storage.getCollection(listStorages.getSelectedValue());
+ FormPlaneConfig framePlaneConfig = new FormPlaneConfig();
+ framePlaneConfig.addButton.addActionListener(e -> {
+ if (drawingPlanes.Insert(framePlaneConfig.drawingPlane)) {
+ framePlaneConfig.dispose();
+ framePlaneConfig.drawingPlane.pictureWidth = pictureBoxCollection.getWidth();
+ framePlaneConfig.drawingPlane.pictureHeight = pictureBoxCollection.getHeight();
+ JOptionPane.showMessageDialog(null, "Объект добавлен", "Информация", JOptionPane.INFORMATION_MESSAGE);
pictureBoxCollection.repaint();
}
else {
- JOptionPane.showMessageDialog(this, "Не удалось добавить объект");
+ JOptionPane.showMessageDialog(null, "Не удалось добавить объект", "Информация", JOptionPane.INFORMATION_MESSAGE);
}
});
+ framePlaneConfig.cancelButton.addActionListener(e -> framePlaneConfig.dispose());
}
private void buttonRemovePlaneClick(){
if (listStorages.getSelectedIndex() == -1)