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