diff --git a/laba1Loco/DrawingTrain.java b/laba1Loco/DrawingTrain.java
index db5143c..af1fd7c 100644
--- a/laba1Loco/DrawingTrain.java
+++ b/laba1Loco/DrawingTrain.java
@@ -17,11 +17,11 @@ public class DrawingTrain {
///
/// Ширина окна
///
- protected int _pictureWidth;
+ public int _pictureWidth;
///
/// Высота окна
///
- protected int _pictureHeight;
+ public int _pictureHeight;
///
/// Левая координата прорисовки локомотива
///
diff --git a/laba1Loco/EntityLoco.java b/laba1Loco/EntityLoco.java
index 27d16d3..3c75e2d 100644
--- a/laba1Loco/EntityLoco.java
+++ b/laba1Loco/EntityLoco.java
@@ -8,6 +8,8 @@ import java.awt.event.*;
public class EntityLoco extends EntityTrain{
public Color AdditionalColor;
+
+ public void setAdditionalColor(Color color){AdditionalColor = color;}
///
/// Признак (опция) наличия трубы
///
diff --git a/laba1Loco/EntityTrain.java b/laba1Loco/EntityTrain.java
index a25d1d2..6eb7775 100644
--- a/laba1Loco/EntityTrain.java
+++ b/laba1Loco/EntityTrain.java
@@ -19,6 +19,8 @@ public class EntityTrain {
/// Основной цвет
///
public Color BodyColor;
+
+ public void setBodyColor(Color color){BodyColor = color;}
///
/// Шаг перемещения поезда
///
diff --git a/laba1Loco/FormTrainCollecltion.java b/laba1Loco/FormTrainCollecltion.java
index 55817e6..a134a55 100644
--- a/laba1Loco/FormTrainCollecltion.java
+++ b/laba1Loco/FormTrainCollecltion.java
@@ -90,11 +90,11 @@ public class FormTrainCollecltion {
return;
}
- FormTrain form = new FormTrain();
- form.buttonSelectTrain.addActionListener(
+ FormTrainConfig form = new FormTrainConfig();
+ form.buttonAdd.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e){
- if (obj.Add(form._drawingTrain) != -1)
+ if (obj != null && obj.Add(form._train) != -1)
{
JOptionPane.showMessageDialog(null, "Объект добавлен", "Информация", JOptionPane.INFORMATION_MESSAGE);
System.out.println("Объект добавлен");
diff --git a/laba1Loco/FormTrainConfig.java b/laba1Loco/FormTrainConfig.java
new file mode 100644
index 0000000..301d8d7
--- /dev/null
+++ b/laba1Loco/FormTrainConfig.java
@@ -0,0 +1,407 @@
+package laba1Loco;
+
+import java.awt.*;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.StringSelection;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.util.*;
+import javax.swing.*;
+import javax.swing.border.Border;
+
+import java.awt.event.*;
+import java.io.IOException;
+
+public class FormTrainConfig {
+ private class Canvas extends JComponent{
+ public Canvas(){
+ }
+ public void paintComponent (Graphics g){
+ if (_train == null){
+ return;
+ }
+ super.paintComponents (g) ;
+ Graphics2D g2d = (Graphics2D)g;
+ _train.DrawTransport(g2d);
+ super.repaint();
+ }
+ }
+ //класс для перетаскивания типа объекта
+ private 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 class ColorTransferable implements Transferable {
+ private Color color;
+ private static final DataFlavor colorDataFlavor = new DataFlavor(Color.class, "Color");
+
+ public ColorTransferable(Color color) {
+ this.color = 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, IOException {
+ if (isDataFlavorSupported(flavor)) {
+ return color;
+ } else {
+ throw new UnsupportedFlavorException(flavor);
+ }
+ }
+ }
+ //для перетаскивания цвета
+ private class PanelTransferHandler extends TransferHandler {
+ @Override
+ public int getSourceActions(JComponent c) {
+ return TransferHandler.COPY;
+ }
+
+ @Override
+ protected Transferable createTransferable(JComponent c) {
+ return new ColorTransferable(((JPanel)c).getBackground());
+ }
+ }
+ //для обработки нажатий
+ private class LabelMouseAdapter extends MouseAdapter{
+ @Override
+ public void mousePressed(MouseEvent e) {
+ ((JLabel)e.getComponent()).getTransferHandler().exportAsDrag(((JLabel)e.getComponent()), e, TransferHandler.COPY);
+ }
+ }
+ private class PanelMouseAdapter extends MouseAdapter{
+ @Override
+ public void mousePressed(MouseEvent e) {
+ ((JPanel)e.getComponent()).getTransferHandler().exportAsDrag(((JPanel)e.getComponent()), e, TransferHandler.COPY);
+ }
+ }
+
+ //что бы wheel'ы можно было тоскать
+ private class WheelTransferable implements Transferable {
+ private IWheelDrawing wheelDrawing;
+ private static final DataFlavor wheelDrawingDataFlavor = new DataFlavor(IWheelDrawing.class, "Wheel Drawing");
+
+ public WheelTransferable(IWheelDrawing wheelDrawing) {
+ this.wheelDrawing = wheelDrawing;
+ }
+
+ @Override
+ public DataFlavor[] getTransferDataFlavors() {
+ return new DataFlavor[]{wheelDrawingDataFlavor};
+ }
+
+ @Override
+ public boolean isDataFlavorSupported(DataFlavor flavor) {
+ return flavor.equals(wheelDrawingDataFlavor);
+ }
+
+ @Override
+ public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
+ if (isDataFlavorSupported(flavor)) {
+ return wheelDrawing;
+ } else {
+ throw new UnsupportedFlavorException(flavor);
+ }
+ }
+ }
+ //для отрисовки wheel'ов, которые можно взять и потащить
+ private class ComponentWheel extends JComponent{
+ public IWheelDrawing wheelDrawing;
+
+ public ComponentWheel(IWheelDrawing _wheelDrawing){
+ wheelDrawing = _wheelDrawing;
+ this.addMouseListener(
+ new MouseAdapter(){
+ @Override
+ public void mousePressed(MouseEvent e) {
+ ((ComponentWheel)e.getComponent()).getTransferHandler().exportAsDrag(((ComponentWheel)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 WheelTransferable(((ComponentWheel)c).wheelDrawing);
+ }
+ }
+ );
+ }
+
+ public void paintComponent (Graphics g){
+ super.paintComponents (g) ;
+ Graphics2D g2d = (Graphics2D)g;
+ wheelDrawing.Draw(-3,-34,false,Color.BLACK,g2d);
+ super.repaint();
+ }
+ }
+
+ final int WindowHeight = 700;
+ final int WindowWidth = 800;
+ final int CanvasHeight = 600;
+ final int CanvasWidth = 600;
+ public DrawingTrain _train = null;
+ public JButton buttonAdd;
+ public JFrame w;
+ public Canvas canvas;
+
+ public FormTrainConfig(){
+
+ Border border = BorderFactory.createLineBorder(Color.GRAY);
+ JLabel labelSpeed = new JLabel("Speed");
+ JLabel labelWeight = new JLabel("Weight");
+ JLabel labelWheelNum = new JLabel("Wheel");
+ SpinnerModel spinnerModel = new SpinnerNumberModel(100, 100, 1000, 1);
+ JSpinner numericSpeed = new JSpinner(spinnerModel);
+ SpinnerModel spinnerModel2 = new SpinnerNumberModel(100, 100, 1000, 1);
+ JSpinner numericWeight = new JSpinner(spinnerModel2);
+ SpinnerModel spinnerModel3 = new SpinnerNumberModel(2, 2, 4, 1);
+ JSpinner numericWheelNum = new JSpinner(spinnerModel3);
+ JCheckBox checkBoxTube = new JCheckBox("Smoke tube");
+ JCheckBox checkBoxFuelTank = new JCheckBox("Fuel tank");
+ JCheckBox checkBoxLocoLine = new JCheckBox("Loco line");
+ JPanel[] colorPanels = {
+ new JPanel(),new JPanel(),new JPanel(),new JPanel(),
+ new JPanel(),new JPanel(),new JPanel(),new JPanel(),
+ };
+ colorPanels[0].setBackground(Color.BLACK);
+ colorPanels[1].setBackground(Color.BLUE);
+ colorPanels[2].setBackground(Color.GRAY);
+ colorPanels[3].setBackground(Color.YELLOW);
+ colorPanels[4].setBackground(Color.RED);
+ colorPanels[5].setBackground(Color.GREEN);
+ colorPanels[6].setBackground(Color.ORANGE);
+ colorPanels[7].setBackground(Color.WHITE);
+ for (var it : colorPanels){
+ it.setTransferHandler(new PanelTransferHandler());
+ it.addMouseListener(new PanelMouseAdapter());
+ }
+
+ JLabel labelTrain = new JLabel("Train");
+ labelTrain.setTransferHandler(new LabelTransferHandler());
+ labelTrain.addMouseListener(new LabelMouseAdapter());
+ labelTrain.setBorder(border);
+ labelTrain.setHorizontalAlignment(SwingConstants.CENTER);
+ labelTrain.setVerticalAlignment(SwingConstants.CENTER);
+
+ JLabel labelLoco = new JLabel("Loco");
+ labelLoco.setTransferHandler(new LabelTransferHandler());
+ labelLoco.addMouseListener(new LabelMouseAdapter());
+ labelLoco.setBorder(border);
+ labelLoco.setHorizontalAlignment(SwingConstants.CENTER);
+ labelLoco.setVerticalAlignment(SwingConstants.CENTER);
+
+ JLabel labelColor = new JLabel("Color");
+ labelColor.setBorder(border);
+ labelColor.setHorizontalAlignment(SwingConstants.CENTER);
+ labelColor.setVerticalAlignment(SwingConstants.CENTER);
+ labelColor.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 (_train == null)
+ return false;
+ _train.EntityTrain.setBodyColor(color);
+ canvas.repaint();
+ return true;
+ } catch (UnsupportedFlavorException | IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return false;
+ }
+ }
+ );
+
+ JLabel labelAdditionalColor = new JLabel("Additional color");
+ labelAdditionalColor.setBorder(border);
+ labelAdditionalColor.setHorizontalAlignment(SwingConstants.CENTER);
+ labelAdditionalColor.setVerticalAlignment(SwingConstants.CENTER);
+ labelAdditionalColor.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 (_train == null)
+ return false;
+ if (!(_train instanceof DrawingLoco))
+ return false;
+ ((EntityLoco)_train.EntityTrain).setAdditionalColor(color);
+ return true;
+ } catch (UnsupportedFlavorException | IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return false;
+ }
+ }
+ );
+
+ JLabel labelWheel = new JLabel("Wheel");
+ labelWheel.setBorder(border);
+ labelWheel.setHorizontalAlignment(SwingConstants.CENTER);
+ labelWheel.setVerticalAlignment(SwingConstants.CENTER);
+ labelWheel.setTransferHandler(
+ new TransferHandler(){
+ @Override
+ public boolean canImport(TransferHandler.TransferSupport support) {
+ return support.isDataFlavorSupported(WheelTransferable.wheelDrawingDataFlavor);
+ }
+
+ @Override
+ public boolean importData(TransferHandler.TransferSupport support) {
+ if (canImport(support)) {
+ try {
+ IWheelDrawing wheelDrawing = (IWheelDrawing) support.getTransferable().getTransferData(WheelTransferable.wheelDrawingDataFlavor);
+ if (_train == null)
+ return false;
+ wheelDrawing.setNumWheel(_train.EntityTrain.numWheel);
+ _train.wheelDrawing = wheelDrawing;
+ canvas.repaint();
+ } catch (UnsupportedFlavorException | IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return false;
+ }
+ }
+ );
+
+ canvas = new Canvas();
+ canvas.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 {
+ String data = (String) support.getTransferable().getTransferData(DataFlavor.stringFlavor);
+ switch (data) {
+ case "Train":
+ _train = new DrawingTrain((int)numericSpeed.getValue(), (int)numericWeight.getValue(), Color.WHITE, (int)numericWheelNum.getValue(), CanvasWidth,CanvasHeight);
+ break;
+ case "Loco":
+ _train = new DrawingLoco((int)numericSpeed.getValue(), (int)numericWeight.getValue(), Color.WHITE, (int)numericWheelNum.getValue(), Color.BLACK, checkBoxTube.isSelected(), checkBoxFuelTank.isSelected(), checkBoxLocoLine.isSelected(), CanvasWidth,CanvasHeight);
+ break;
+ }
+ canvas.repaint();
+ return true;
+ } catch (UnsupportedFlavorException | IOException e) {
+ e.printStackTrace();
+ }
+ }
+ return false;
+ }
+ }
+ );
+
+ buttonAdd = new JButton("Add");
+ JButton buttonCancel = new JButton("Cancel");
+
+ ComponentWheel componentWheelSimple = new ComponentWheel(new WheelDrawingSimple());
+ ComponentWheel componentWheelBalls = new ComponentWheel(new WheelDrawingBalls());
+ ComponentWheel componentWheelDavidStar = new ComponentWheel(new WheelDrawingDavidStar());
+
+ labelSpeed.setBounds(10,10,40,20);
+ labelWeight.setBounds(10,40,40,20);
+ labelWheelNum.setBounds(10,70,40,20);
+ numericSpeed.setBounds(55,10,80,20);
+ numericWeight.setBounds(55,40,80,20);
+ numericWheelNum.setBounds(55,70,80,20);
+ checkBoxTube.setBounds(10,100,120,20);
+ checkBoxFuelTank.setBounds(10,130,120,20);
+ checkBoxLocoLine.setBounds(10,160,120,20);
+ for (int i = 0; i < colorPanels.length; i+=2){
+ colorPanels[i].setBounds(10,200+i/2*60,50,50);
+ colorPanels[i+1].setBounds(70,200+i/2*60,50,50);
+ }
+ componentWheelSimple.setBounds(10,470,8,8);
+ componentWheelBalls.setBounds(30,470,8,8);
+ componentWheelDavidStar.setBounds(50,470,8,8);
+ labelTrain.setBounds(10,500 ,50,30);
+ labelLoco.setBounds(70,500 ,50,30);
+
+ labelColor.setBounds(WindowWidth-CanvasWidth, 10, CanvasWidth/3, 30);
+ labelAdditionalColor.setBounds(WindowWidth-CanvasWidth + CanvasWidth/3, 10, CanvasWidth/3, 30);
+ labelWheel.setBounds(WindowWidth-CanvasWidth + CanvasWidth*2/3, 10, CanvasWidth/3, 30);
+ canvas.setBounds(WindowWidth-CanvasWidth, 50, CanvasWidth, CanvasHeight);
+ buttonAdd.setBounds(WindowWidth-CanvasWidth, CanvasHeight+60, CanvasWidth/3, 30);
+ buttonCancel.setBounds(WindowWidth-CanvasWidth + CanvasWidth*2/3, CanvasHeight+60, CanvasWidth/3, 30);
+
+ w = new JFrame();
+ w.setSize (WindowWidth+20, WindowHeight+40);
+ w.setLayout(null);
+ w.add(labelSpeed);
+ w.add(labelWeight);
+ w.add(labelWheelNum);
+ w.add(numericSpeed);
+ w.add(numericWeight);
+ w.add(numericWheelNum);
+ w.add(checkBoxTube);
+ w.add(checkBoxFuelTank);
+ w.add(checkBoxLocoLine);
+ for (var it : colorPanels)
+ w.add(it);
+ w.add(labelTrain);
+ w.add(labelLoco);
+ w.add(labelColor);
+ w.add(labelAdditionalColor);
+ w.add(labelWheel);
+ w.add(canvas);
+ w.add(buttonAdd);
+ w.add(buttonCancel);
+ w.add(componentWheelSimple);
+ w.add(componentWheelBalls);
+ w.add(componentWheelDavidStar);
+
+ w.setVisible(true);
+
+ buttonCancel.addActionListener(
+ new ActionListener() {
+ public void actionPerformed(ActionEvent e){
+ w.dispose();
+ }
+ }
+ );
+ }
+}
diff --git a/laba1Loco/TrainsGenericCollection.java b/laba1Loco/TrainsGenericCollection.java
index 12461bc..5063084 100644
--- a/laba1Loco/TrainsGenericCollection.java
+++ b/laba1Loco/TrainsGenericCollection.java
@@ -117,6 +117,8 @@ public class TrainsGenericCollection