383 lines
17 KiB
Java
383 lines
17 KiB
Java
import javax.swing.*;
|
||
import javax.swing.border.Border;
|
||
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.awt.event.ActionEvent;
|
||
import java.awt.event.ActionListener;
|
||
import java.awt.event.MouseAdapter;
|
||
import java.awt.event.MouseEvent;
|
||
import java.io.IOException;
|
||
public class FormCruiserConfig extends JDialog {
|
||
public DrawingCruiser drawingCruiser;
|
||
JPanel cruiserPanel = new JPanel();
|
||
protected DrawingCruiser SelectedCruiser;
|
||
protected static JLabel colorLabel = new JLabel("Цвет", 0);
|
||
protected JLabel colorAddLabel = new JLabel("Доп. цвет", 0);
|
||
FormCruiserConfig() {
|
||
setTitle("Cruiser");
|
||
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||
this.setModalExclusionType(ModalExclusionType.APPLICATION_EXCLUDE);
|
||
this.setModalityType(ModalityType.APPLICATION_MODAL);
|
||
this.setResizable(false);
|
||
setSize(900, 400);
|
||
setLayout(null);
|
||
JCheckBox ifTentCheckBox = new JCheckBox("Признак наличия площадки под вертолет");
|
||
JCheckBox ifKitCheckBox = new JCheckBox("Признак наличия ракетных шахт ");
|
||
ifTentCheckBox.setBounds(20, 200, 150, 30);
|
||
this.add(ifTentCheckBox);
|
||
ifKitCheckBox.setBounds(20, 250, 150, 30);
|
||
this.add(ifKitCheckBox);
|
||
JSpinner speedSpinner = new JSpinner();
|
||
speedSpinner.setBounds(20 + 100, 100, 50, 20);
|
||
speedSpinner.setValue(100);
|
||
this.add(speedSpinner);
|
||
JSpinner weightSpinner = new JSpinner();
|
||
weightSpinner.setBounds(20 + 100, 150, 50, 20);
|
||
weightSpinner.setValue(100);
|
||
this.add(weightSpinner);
|
||
JLabel speedLabel = new JLabel("Скорость");
|
||
speedLabel.setBounds(20, 100, 150, 20);
|
||
this.add(speedLabel);
|
||
JLabel weightLabel = new JLabel("Вес");
|
||
weightLabel.setBounds(20, 150, 150, 20);
|
||
this.add(weightLabel);
|
||
int xStart = 300;
|
||
int yStart = 50;
|
||
int panelColorSize = 50;
|
||
Color[] colors = {Color.RED, Color.ORANGE, Color.YELLOW, Color.GREEN, Color.CYAN, Color.BLUE, Color.MAGENTA, Color.PINK};
|
||
for (int i = 0; i < 2; i++) {
|
||
for (int j = 0; j < 4; j++) {
|
||
JPanel colorPanel = new JPanel();
|
||
colorPanel.setTransferHandler(new PanelTransferHandler());
|
||
colorPanel.addMouseListener(new PanelMouseAdapter());
|
||
colorPanel.setBackground(colors[i * 4 + j]);
|
||
colorPanel.setBounds(xStart, yStart, panelColorSize, panelColorSize);
|
||
this.add(colorPanel);
|
||
xStart += panelColorSize + 10;
|
||
}
|
||
yStart += panelColorSize + 10;
|
||
xStart -= (4 * panelColorSize + 40);
|
||
}
|
||
JLabel easyLabel = new JLabel("Простой", 0);
|
||
easyLabel.setTransferHandler(new LabelTransferHandler());
|
||
easyLabel.addMouseListener(new LabelMouseAdapter());
|
||
easyLabel.setBounds(300, 300, 100, 50);
|
||
easyLabel.setOpaque(true);
|
||
easyLabel.setBackground(Color.LIGHT_GRAY);
|
||
this.add(easyLabel);
|
||
JLabel hardLabel = new JLabel("Продвинутый", 0);
|
||
hardLabel.setTransferHandler(new LabelTransferHandler());
|
||
hardLabel.addMouseListener(new LabelMouseAdapter());
|
||
hardLabel.setBounds(410, 300, 100, 50);
|
||
hardLabel.setOpaque(true);
|
||
hardLabel.setBackground(Color.LIGHT_GRAY);
|
||
this.add(hardLabel);
|
||
colorLabel.setTransferHandler(new TransferHandler("background"));
|
||
colorLabel.setBounds(600, 50, 100, 40);
|
||
colorLabel.setOpaque(true);
|
||
Border border = BorderFactory.createLineBorder(Color.BLACK, 1); // Создание границы
|
||
colorLabel.setBorder(border);
|
||
this.add(colorLabel);
|
||
colorAddLabel.setTransferHandler(new TransferHandler("background"));
|
||
colorAddLabel.setBounds(750, 50, 100, 40);
|
||
colorAddLabel.setOpaque(true);
|
||
colorAddLabel.setBorder(border);
|
||
this.add(colorAddLabel);
|
||
JLabel iDopLabel = new JLabel("Палубы", 0);
|
||
iDopLabel.setBounds(680, 10, 100, 30);
|
||
iDopLabel.setOpaque(true);
|
||
iDopLabel.setBorder(border);
|
||
this.add(iDopLabel);
|
||
colorLabel.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 (drawingCruiser == null)
|
||
return false;
|
||
drawingCruiser.ChangeColor(color);
|
||
colorLabel.setBackground(color);
|
||
repaintPanel();
|
||
return true;
|
||
} catch (UnsupportedFlavorException | IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
);
|
||
colorAddLabel.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 (drawingCruiser == null || !(drawingCruiser instanceof DrawingAdvancedCruiser))
|
||
return false;
|
||
((DrawingAdvancedCruiser) drawingCruiser).ChangeAddColor(color);
|
||
colorAddLabel.setBackground(color);
|
||
repaintPanel();
|
||
return true;
|
||
} catch (UnsupportedFlavorException | IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
);
|
||
JSpinner numOfWheelsSpinner = new JSpinner();
|
||
iDopLabel.setTransferHandler(
|
||
new TransferHandler() {
|
||
@Override
|
||
public boolean canImport(TransferHandler.TransferSupport support) {
|
||
return support.isDataFlavorSupported(iDopTransferable.iDrawDataFlavor);
|
||
}
|
||
@Override
|
||
public boolean importData(TransferHandler.TransferSupport support) {
|
||
if (canImport(support)) {
|
||
try {
|
||
IDop obj = (IDop) support.getTransferable().getTransferData(iDopTransferable.iDrawDataFlavor);
|
||
if (drawingCruiser == null)
|
||
return false;
|
||
drawingCruiser.ChangeIDop(obj, (String) numOfWheelsSpinner.getValue());
|
||
repaintPanel();
|
||
return true;
|
||
} catch (UnsupportedFlavorException | IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
);
|
||
JButton deleteButton = new JButton("Отмена");
|
||
deleteButton.setBounds(750, 300, 100, 30);
|
||
this.add(deleteButton);
|
||
JButton buttonCruiser = new JButton("Добавить");
|
||
buttonCruiser.addActionListener(new ActionListener() {
|
||
@Override
|
||
public void actionPerformed(ActionEvent e) {
|
||
SelectedCruiser = drawingCruiser;
|
||
dispose();
|
||
}
|
||
});
|
||
buttonCruiser.setBounds(600, 300, 100, 30);
|
||
this.add(buttonCruiser);
|
||
JLabel numWheelsLabel = new JLabel("Палубы");
|
||
numWheelsLabel.setBounds(300, 200, 70, 20);
|
||
this.add(numWheelsLabel);
|
||
numOfWheelsSpinner.setValue(3);
|
||
numOfWheelsSpinner.setBounds(370, 200, 40, 20);
|
||
this.add(numOfWheelsSpinner);
|
||
IDopComponent triangleLComp = new IDopComponent(new DopClassMixed(3));
|
||
JLabel triangleLabel = new JLabel("1 вид", 0);
|
||
triangleLComp.add(triangleLabel);
|
||
triangleLComp.setBounds(300, 250, 20, 20);
|
||
triangleLComp.setBorder(border);
|
||
this.add(triangleLComp);
|
||
IDopComponent rectComp = new IDopComponent(new DopClassRect(3));
|
||
JLabel rectLabel = new JLabel("2 вид", 0);
|
||
rectComp.add(rectLabel);
|
||
rectComp.setBounds(330, 250, 20, 20);
|
||
rectComp.setBorder(border);
|
||
this.add(rectComp);
|
||
IDopComponent circleComp = new IDopComponent(new NumberOfWheels(3));
|
||
JLabel circleLabel = new JLabel("3 вид", 0);
|
||
circleComp.add(circleLabel);
|
||
circleComp.setBounds(360, 250, 20, 20);
|
||
circleComp.setBorder(border);
|
||
this.add(circleComp);
|
||
|
||
cruiserPanel.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 {
|
||
int speed = ((Number) speedSpinner.getValue()).intValue();
|
||
int weight = ((Number) weightSpinner.getValue()).intValue();
|
||
int enginesNumber = ((Number) numOfWheelsSpinner.getValue()).intValue();
|
||
|
||
switch ((String) support.getTransferable().getTransferData(DataFlavor.stringFlavor)) {
|
||
case "Простой" -> {
|
||
drawingCruiser = new DrawingCruiser(speed, weight, Color.WHITE,
|
||
cruiserPanel.getWidth(), cruiserPanel.getHeight(), 0, enginesNumber);
|
||
}
|
||
case "Продвинутый" -> {
|
||
drawingCruiser = new DrawingAdvancedCruiser(speed, (double) weight, Color.WHITE, Color.BLACK,
|
||
ifKitCheckBox.isSelected(), ifTentCheckBox.isSelected(), true, cruiserPanel.getWidth(), cruiserPanel.getHeight());
|
||
}
|
||
|
||
}
|
||
drawingCruiser.SetPosition(10, 10);
|
||
|
||
repaintPanel();
|
||
return true;
|
||
} catch (UnsupportedFlavorException | IOException e) {
|
||
e.printStackTrace();
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
}
|
||
);
|
||
cruiserPanel.setBounds(600, 100, 250, 190);
|
||
|
||
this.add(cruiserPanel);
|
||
|
||
this.setVisible(true);
|
||
}
|
||
void repaintPanel() {
|
||
Graphics g = cruiserPanel.getGraphics();
|
||
g.clearRect(0, 0, cruiserPanel.getWidth(), cruiserPanel.getHeight());
|
||
drawingCruiser.DrawTransport(g);
|
||
}
|
||
private static 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 record ColorTransferable(Color color) implements Transferable {
|
||
private static final DataFlavor colorDataFlavor = new DataFlavor(Color.class, "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 {
|
||
if (isDataFlavorSupported(flavor)) {
|
||
return color;
|
||
} else {
|
||
throw new UnsupportedFlavorException(flavor);
|
||
}
|
||
}
|
||
}
|
||
private static class PanelTransferHandler extends TransferHandler {
|
||
@Override
|
||
public int getSourceActions(JComponent c) {
|
||
return TransferHandler.COPY;
|
||
}
|
||
@Override
|
||
protected Transferable createTransferable(JComponent c) {
|
||
return new ColorTransferable(c.getBackground());
|
||
}
|
||
}
|
||
private static class LabelMouseAdapter extends MouseAdapter {
|
||
@Override
|
||
public void mousePressed(MouseEvent e) {
|
||
((JLabel) e.getComponent()).getTransferHandler().exportAsDrag(((JLabel) e.getComponent()), e, TransferHandler.COPY);
|
||
}
|
||
}
|
||
private static class PanelMouseAdapter extends MouseAdapter {
|
||
@Override
|
||
public void mousePressed(MouseEvent e) {
|
||
((JPanel) e.getComponent()).getTransferHandler().exportAsDrag(((JPanel) e.getComponent()), e, TransferHandler.COPY);
|
||
}
|
||
}
|
||
private record IDopTransferable(IDop obj) implements Transferable {
|
||
private static final DataFlavor colorDataFlavor = new DataFlavor(Color.class, "IDop");
|
||
@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 {
|
||
if (isDataFlavorSupported(flavor)) {
|
||
return obj;
|
||
} else {
|
||
throw new UnsupportedFlavorException(flavor);
|
||
}
|
||
}
|
||
}
|
||
private static class IDopMouseAdapter extends MouseAdapter {
|
||
@Override
|
||
public void mousePressed(MouseEvent e) {
|
||
((JLabel) e.getComponent()).getTransferHandler().exportAsDrag(((JLabel) e.getComponent()), e, TransferHandler.COPY);
|
||
}
|
||
}
|
||
private class iDopTransferable implements Transferable {
|
||
private IDop iDopObject;
|
||
private static final DataFlavor iDrawDataFlavor = new DataFlavor(IDop.class, "IDraw");
|
||
public iDopTransferable(IDop iDrawObject) {
|
||
this.iDopObject = iDrawObject;
|
||
}
|
||
@Override
|
||
public DataFlavor[] getTransferDataFlavors() {
|
||
return new DataFlavor[]{iDrawDataFlavor};
|
||
}
|
||
@Override
|
||
public boolean isDataFlavorSupported(DataFlavor flavor) {
|
||
return iDrawDataFlavor.equals(flavor);
|
||
}
|
||
@Override
|
||
public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException, IOException {
|
||
if (isDataFlavorSupported(flavor)) {
|
||
return iDopObject;
|
||
} else {
|
||
throw new UnsupportedFlavorException(flavor);
|
||
}
|
||
}
|
||
}
|
||
private class IDopComponent extends JComponent {
|
||
public IDop obj;
|
||
public IDopComponent(IDop obj) {
|
||
this.obj = obj;
|
||
this.addMouseListener(
|
||
new MouseAdapter() {
|
||
@Override
|
||
public void mousePressed(MouseEvent e) {
|
||
((IDopComponent) e.getComponent()).getTransferHandler().exportAsDrag(((IDopComponent) 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 iDopTransferable(((IDopComponent) c).obj);
|
||
}
|
||
}
|
||
);
|
||
}
|
||
}
|
||
public DrawingCruiser getSelectedCruiser() {
|
||
return SelectedCruiser;
|
||
}
|
||
} |