2023-12-13 11:17:37 +04:00

513 lines
20 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}