package Trolleybus; 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; public class FormBusConfig { JFrame frameBusConfig; JPanel panelConfig, panelColors, panelObject; ComponentDrawingConfig drawingConfig; // Замена pictureBox ComponentDoors rectangleDoors, triangleDoors, ovalDoors; // Компоненты - типы дверей JPanel panelRed, panelOrange, panelYellow, panelGreen, panelBlue, panelPurple, panelGray, panelBlack; JLabel labelSimpleObject, labelAdvancedObject, labelMainColor, labelAdditionalColor, labelTypeOfDoors, labelRectDoors, labelTrianDoors, labelOvalDoors; JLabel labelSpeed, labelWeight, labelDoors; JSpinner speedSpinner, weightSpinner, doorSpinner; SpinnerNumberModel speedSpinnerModel, weightSpinnerModel, doorSpinnerModel; JCheckBox checkBoxHorns, checkBoxBatteries; JButton buttonAdd, buttonCancel; public FormBusConfig() { InitializeComponent(); } private void InitializeComponent() { //Само окно frameBusConfig = new JFrame("Настройки автобуса"); frameBusConfig.setLayout(null); frameBusConfig.setSize(1000, 450); frameBusConfig.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); // Панель создания автобуса panelConfig = new JPanel(); panelConfig.setBounds(10, 20, 570, 360); panelConfig.setBorder(BorderFactory.createLineBorder(Color.BLACK)); panelConfig.setLayout(null); // Настройка скорости и веса speedSpinnerModel = new SpinnerNumberModel(100, 100, 1000, 1); weightSpinnerModel = new SpinnerNumberModel(100, 100, 1000, 1); speedSpinner = new JSpinner(speedSpinnerModel); speedSpinner.setBounds(100, 30, 150, 30); weightSpinner = new JSpinner(weightSpinnerModel); weightSpinner.setBounds(100, 70, 150, 30); labelSpeed = new JLabel("Скорость:"); labelSpeed.setBounds(5, 30, 95, 20); labelWeight = new JLabel("Вес:"); labelWeight.setBounds(5, 70, 95, 20); // Настройка кол-ва дверей doorSpinnerModel = new SpinnerNumberModel(3, 3, 5, 1); doorSpinner = new JSpinner(doorSpinnerModel); doorSpinner.setBounds(100, 110, 150, 30); labelDoors = new JLabel("Кол-во дверей:"); labelDoors.setBounds(5, 110, 95, 20); // Настройка доп. свойств для троллейбуса checkBoxHorns = new JCheckBox("Наличие \"рогов\""); checkBoxHorns.setBounds(5, 140, 200, 30); checkBoxBatteries = new JCheckBox("Наличие отсека для батарей"); checkBoxBatteries.setBounds(5, 170, 200, 30); // Панель с цветами panelColors = new JPanel(); panelColors.setBounds(280, 30, 270, 150); panelColors.setBorder(BorderFactory.createLineBorder(Color.BLACK)); panelColors.setLayout(null); panelRed = new JPanel(); panelRed.setBackground(Color.RED); panelRed.setBounds(5, 25, 50, 40); panelRed.setTransferHandler(new PanelTransferHandler()); panelRed.addMouseListener(new PanelMouseAdapter()); panelOrange = new JPanel(); panelOrange.setBackground(Color.ORANGE); panelOrange.setBounds(75, 25, 50, 40); panelOrange.setTransferHandler(new PanelTransferHandler()); panelOrange.addMouseListener(new PanelMouseAdapter()); panelYellow = new JPanel(); panelYellow.setBackground(Color.YELLOW); panelYellow.setBounds(145, 25, 50, 40); panelYellow.setTransferHandler(new PanelTransferHandler()); panelYellow.addMouseListener(new PanelMouseAdapter()); panelGreen = new JPanel(); panelGreen.setBackground(Color.GREEN); panelGreen.setBounds(215, 25, 50, 40); panelGreen.setTransferHandler(new PanelTransferHandler()); panelGreen.addMouseListener(new PanelMouseAdapter()); panelBlue = new JPanel(); panelBlue.setBackground(Color.BLUE); panelBlue.setBounds(5, 85, 50, 40); panelBlue.setTransferHandler(new PanelTransferHandler()); panelBlue.addMouseListener(new PanelMouseAdapter()); panelPurple = new JPanel(); panelPurple.setBackground(Color.MAGENTA); panelPurple.setBounds(75, 85, 50, 40); panelPurple.setTransferHandler(new PanelTransferHandler()); panelPurple.addMouseListener(new PanelMouseAdapter()); panelGray = new JPanel(); panelGray.setBackground(Color.GRAY); panelGray.setBounds(145, 85, 50, 40); panelGray.setTransferHandler(new PanelTransferHandler()); panelGray.addMouseListener(new PanelMouseAdapter()); panelBlack = new JPanel(); panelBlack.setBackground(Color.BLACK); panelBlack.setBounds(215, 85, 50, 40); panelBlack.setTransferHandler(new PanelTransferHandler()); panelBlack.addMouseListener(new PanelMouseAdapter()); panelColors.add(panelRed); panelColors.add(panelOrange); panelColors.add(panelYellow); panelColors.add(panelGreen); panelColors.add(panelBlue); panelColors.add(panelPurple); panelColors.add(panelGray); panelColors.add(panelBlack); // Надписи с Drag&Drop на панели с параметрами labelSimpleObject = new JLabel("Простой"); labelSimpleObject.setBounds(280, 190, 120, 30); labelSimpleObject.setBorder(BorderFactory.createLineBorder(Color.BLACK)); labelSimpleObject.setHorizontalAlignment(SwingConstants.CENTER); labelSimpleObject.setTransferHandler(new LabelTransferHandler()); labelSimpleObject.addMouseListener(new LabelMouseAdapter()); labelAdvancedObject = new JLabel("Продвинутый"); labelAdvancedObject.setBounds(430, 190, 120, 30); labelAdvancedObject.setBorder(BorderFactory.createLineBorder(Color.BLACK)); labelAdvancedObject.setHorizontalAlignment(SwingConstants.CENTER); labelAdvancedObject.setTransferHandler(new LabelTransferHandler()); labelAdvancedObject.addMouseListener(new LabelMouseAdapter()); // Компоненты - типы дверей // Прямоугольные двери rectangleDoors = new ComponentDoors(new DrawingDoors()); rectangleDoors.setBounds(330, 240, 170, 30); rectangleDoors.setLayout(new GridLayout(1,1)); rectangleDoors.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // Надпись для компонента прямоугольных дверей labelRectDoors = new JLabel("Прямоугольные двери"); labelRectDoors.setHorizontalAlignment(SwingConstants.CENTER); rectangleDoors.add(labelRectDoors); // Треугольные двери triangleDoors = new ComponentDoors(new DrawingTriangleDoors()); triangleDoors.setBounds(330, 280, 170, 30); triangleDoors.setLayout(new GridLayout(1,1)); triangleDoors.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // Надпись для компонента треугольных дверей labelTrianDoors = new JLabel("Треугольные двери"); labelTrianDoors.setHorizontalAlignment(SwingConstants.CENTER); triangleDoors.add(labelTrianDoors); // Овальные двери ovalDoors = new ComponentDoors(new DrawingOvalDoors()); ovalDoors.setBounds(330, 320, 170, 30); ovalDoors.setLayout(new GridLayout(1,1)); ovalDoors.setBorder(BorderFactory.createLineBorder(Color.BLACK)); // Надпись для компонента овальных дверей labelOvalDoors = new JLabel("Овальные двери"); labelOvalDoors.setHorizontalAlignment(SwingConstants.CENTER); ovalDoors.add(labelOvalDoors); panelConfig.add(panelColors); panelConfig.add(speedSpinner); panelConfig.add(labelSpeed); panelConfig.add(weightSpinner); panelConfig.add(labelWeight); panelConfig.add(doorSpinner); panelConfig.add(labelDoors); panelConfig.add(checkBoxBatteries); panelConfig.add(checkBoxHorns); panelConfig.add(labelSimpleObject); panelConfig.add(labelAdvancedObject); panelConfig.add(rectangleDoors); panelConfig.add(triangleDoors); panelConfig.add(ovalDoors); panelObject = new JPanel(); panelObject.setBounds(600, 20, 370, 360); panelObject.setLayout(null); // Надписи с Drag&Drop на панели отображения автобуса labelMainColor = new JLabel("Основной цвет"); labelMainColor.setBounds(10, 10, 110, 60); labelMainColor.setBorder(BorderFactory.createLineBorder(Color.BLACK)); labelMainColor.setHorizontalAlignment(SwingConstants.CENTER); labelMainColor.setTransferHandler(new TransferHandler() { @Override public boolean canImport(TransferHandler.TransferSupport support) { return support.isDataFlavorSupported(ColorTransferable.colorDataFlavor); } @Override public boolean importData(TransferSupport support) { if (canImport(support)) { try { Color color = (Color) support.getTransferable().getTransferData(ColorTransferable.colorDataFlavor); if (drawingConfig._bus == null) { return false; } drawingConfig._bus.getEntityBus().setBodyColor(color); drawingConfig.repaint(); return true; } catch (UnsupportedFlavorException | IOException e) { e.printStackTrace(); } } return false; } }); labelAdditionalColor = new JLabel("Доп. цвет"); labelAdditionalColor.setBounds(130, 10, 110, 60); labelAdditionalColor.setBorder(BorderFactory.createLineBorder(Color.BLACK)); labelAdditionalColor.setHorizontalAlignment(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 (drawingConfig._bus == null) { return false; } if (!(drawingConfig._bus instanceof DrawingTrolleybus)) { return false; } EntityTrolleybus _trolleybus = (EntityTrolleybus)drawingConfig._bus.getEntityBus(); _trolleybus.setAdditionalColor(color); drawingConfig.repaint(); return true; } catch (UnsupportedFlavorException | IOException e) { e.printStackTrace(); } } return false; } }); labelTypeOfDoors = new JLabel("Форма дверей"); labelTypeOfDoors.setBounds(250, 10, 110, 60); labelTypeOfDoors.setBorder(BorderFactory.createLineBorder(Color.BLACK)); labelTypeOfDoors.setHorizontalAlignment(SwingConstants.CENTER); labelTypeOfDoors.setTransferHandler(new TransferHandler() { @Override public boolean canImport(TransferHandler.TransferSupport support) { return support.isDataFlavorSupported(DoorsTransferable.drawingDoorsDataFlavor); } @Override public boolean importData(TransferHandler.TransferSupport support) { if (canImport(support)) { try { IDrawingDoors drawingDoors = (IDrawingDoors)support.getTransferable().getTransferData(DoorsTransferable.drawingDoorsDataFlavor); if (drawingConfig._bus == null) { return false; } int cntOfDoors = drawingConfig._bus.Doors.GetCntOfDoors(); drawingDoors.SetCntOfDoors(cntOfDoors); drawingConfig._bus.Doors = drawingDoors; drawingConfig.repaint(); return true; } catch (UnsupportedFlavorException | IOException e) { e.printStackTrace(); } } return false; } }); drawingConfig = new ComponentDrawingConfig(); drawingConfig.setBounds(10, 80, 350, 200); drawingConfig.setBorder(BorderFactory.createLineBorder(Color.BLACK)); drawingConfig.setLayout(null); drawingConfig.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); if ("Простой".equals(data)) { drawingConfig._bus = new DrawingBus((int)speedSpinner.getValue(), (int)weightSpinner.getValue(), Color.WHITE, drawingConfig.getWidth(), drawingConfig.getHeight(), (int)doorSpinner.getValue()); } else if ("Продвинутый".equals(data)) { drawingConfig._bus = new DrawingTrolleybus((int)speedSpinner.getValue(), (int)weightSpinner.getValue(), Color.WHITE, Color.BLACK, checkBoxHorns.isSelected(), checkBoxBatteries.isSelected(), drawingConfig.getWidth(), drawingConfig.getHeight(), (int)doorSpinner.getValue()); } drawingConfig.repaint(); return true; } catch (UnsupportedFlavorException | IOException e) { e.printStackTrace(); } } return false; } }); buttonAdd = new JButton("Добавить"); buttonAdd.setBounds(10, 300, 100, 30); buttonCancel = new JButton("Отмена"); buttonCancel.setBounds(260, 300, 100, 30); buttonCancel.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { frameBusConfig.dispose(); } }); panelObject.add(labelMainColor); panelObject.add(labelAdditionalColor); panelObject.add(labelTypeOfDoors); panelObject.add(drawingConfig); panelObject.add(buttonAdd); panelObject.add(buttonCancel); frameBusConfig.add(panelConfig); frameBusConfig.add(panelObject); frameBusConfig.setVisible(true); } } 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()); } } class ColorTransferable implements Transferable { private Color color; 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); } } } 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()); } } class LabelMouseAdapter extends MouseAdapter { @Override public void mousePressed(MouseEvent e) { ((JLabel) e.getComponent()).getTransferHandler().exportAsDrag(((JLabel) e.getComponent()), e, TransferHandler.COPY); } } class PanelMouseAdapter extends MouseAdapter{ @Override public void mousePressed(MouseEvent e) { ((JPanel)e.getComponent()).getTransferHandler().exportAsDrag(((JPanel)e.getComponent()), e, TransferHandler.COPY); } } class DoorsTransferable implements Transferable { private IDrawingDoors drawingDoors; static final DataFlavor drawingDoorsDataFlavor = new DataFlavor(IDrawingDoors.class, "IDrawingDoors"); public DoorsTransferable(IDrawingDoors drawingDoors) { this.drawingDoors = drawingDoors; } @Override public DataFlavor[] getTransferDataFlavors() { return new DataFlavor[]{drawingDoorsDataFlavor}; } @Override public boolean isDataFlavorSupported(DataFlavor flavor) { return flavor.equals(drawingDoorsDataFlavor); } @Override public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException { if (isDataFlavorSupported(flavor)) { return drawingDoors; } else { throw new UnsupportedFlavorException(flavor); } } } class ComponentDoors extends JComponent{ public IDrawingDoors drawingDoors; public ComponentDoors(IDrawingDoors drawingDoors){ this.drawingDoors = drawingDoors; this.addMouseListener( new MouseAdapter(){ @Override public void mousePressed(MouseEvent e) { ((ComponentDoors)e.getComponent()).getTransferHandler().exportAsDrag(((ComponentDoors)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 DoorsTransferable(((ComponentDoors)c).drawingDoors); } } ); } } // Замена pictureBox class ComponentDrawingConfig extends JComponent { public DrawingBus _bus; // Выбранный автобус public ComponentDrawingConfig() { _bus = null; } @Override public void paintComponent(Graphics g) { if (_bus == null) { return; } super.paintComponent(g); _bus.DrawTransport(g); super.repaint(); } }