513 lines
20 KiB
Java
Raw Permalink Normal View History

2023-12-13 11:17:37 +04:00
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();
}
}