513 lines
20 KiB
Java
513 lines
20 KiB
Java
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();
|
||
}
|
||
} |