Java 拖放多个/不同的组件

Java 拖放多个/不同的组件,java,drag-and-drop,awt,paintcomponent,graphic,Java,Drag And Drop,Awt,Paintcomponent,Graphic,这是我程序的代码。你能给我一些提示,让其他的矩形像第一个一样移动吗 注意:第一个矩形是唯一可以拖放的矩形 import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.MouseInputAdapter; public class GraphicDragAndDrop extends JPanel { Rectangle and = new Rectangl

这是我程序的代码。你能给我一些提示,让其他的矩形像第一个一样移动吗

注意:第一个矩形是唯一可以拖放的矩形

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.MouseInputAdapter;

public class GraphicDragAndDrop extends JPanel {

        Rectangle and = new Rectangle(5,5,75,75);
        Rectangle or = new Rectangle(5,105,75,75);
        Rectangle xnor = new Rectangle(5,205,75,75);
        Rectangle nand = new Rectangle(5,305,75,75);
        Rectangle xor = new Rectangle(5,405,75,75);
        Rectangle inverter = new Rectangle(5,505,75,75);

    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D)g;
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setPaint(Color.blue);
        g2.draw(and);

         Graphics2D g3 = (Graphics2D)g;
        g3.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g3.setPaint(Color.red);
        g3.draw(or);

        Graphics2D g4 = (Graphics2D)g;
        g4.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g4.setPaint(Color.blue);
        g4.draw(xnor);

        Graphics2D g5 = (Graphics2D)g;
        g5.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g5.setPaint(Color.red);
        g5.draw(nand);

        Graphics2D g6 = (Graphics2D)g;
        g6.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g6.setPaint(Color.blue);
        g6.draw(xor);


        Graphics2D g7 = (Graphics2D)g;
        g7.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                            RenderingHints.VALUE_ANTIALIAS_ON);
        g7.setPaint(Color.red);
        g7.draw(inverter);
    }

    public void setRect(int x, int y) {

       and.setLocation(x, y);
             repaint();

    }

    public static void main(String[] args) {
        GraphicDragAndDrop test = new GraphicDragAndDrop();
        new GraphicDragController(test);
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(test);
        f.setSize(400,400);
        f.setLocation(100,100);
        f.setVisible(true);
    }
}

class GraphicDragController extends MouseInputAdapter {
    GraphicDragAndDrop component;
    Point offset = new Point();
    boolean dragging = false;

    public GraphicDragController(GraphicDragAndDrop gdad) {
        component = gdad;
        component.addMouseListener(this);
        component.addMouseMotionListener(this);
    }

    public void mousePressed(MouseEvent e) {
        Point p = e.getPoint();
        Rectangle r = component.and;
        Rectangle a = component.or;
        if(r.contains(p)) {
            offset.x = p.x - r.x;
            offset.y = p.y - r.y;
            dragging = true;
    }
    }
    public void mouseReleased(MouseEvent e) {
        dragging = false;
    }

    public void mouseDragged(MouseEvent e) {
        if(dragging) {
            int x = e.getX() - offset.x;
            int y = e.getY() - offset.y;
            component.setRect(x, y);
        }


    }
}

感谢您提供的各种帮助:)

第一个矩形是唯一可以拖动的矩形,因为您的类中有硬编码逻辑,它总是引用第一个矩形

您需要更改类的整个设计:

  • 不要硬编码矩形。您需要一个ArrayList来跟踪所有矩形和每个矩形的颜色

  • 在MouseListener代码中,您需要遍历此列表,通过使用矩形的contains(…)方法和MouseEvent中的鼠标点来找出您单击的矩形

  • 找到单击的矩形后,您将需要更改代码来拖动该矩形,而不是现在使用的硬编码“and”变量

  • 需要更改
    paintComponent()
    逻辑,以迭代ArrayList来绘制每个矩形。在尝试修复拖动问题之前,应该首先对代码的这一部分进行重新构造。您可能希望了解如何从ArrayList绘制形状对象的一些想法


  • 可能还有其他问题,但希望这能让您从正确的方向开始。

    绘制每个矩形只需要一个图形对象。