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); } } final int WindowHeight = 700; final int WindowWidth = 1000; 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); _train.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 instanceof DrawingLoco)) return false; ((DrawingLoco)_train).setAdditionalColor(color); return true; } 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"); 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); } 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*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(canvas); w.add(buttonAdd); w.add(buttonCancel); w.setVisible(true); buttonCancel.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e){ w.dispose(); } } ); } }