java - 在Java中的JFrame上拖动矩形

标签 java swing awt drag

我想根据mousedrag事件绘制矩形。如果用户拖动鼠标,则小程序上的矩形应根据当前鼠标坐标增大或减小。 我有以下代码。

在下面的代码中,我使用 SelectionArea 类,它扩展了我正在其上执行绘图操作的 Canvas 。我在此类中使用图像变量进行双缓冲,以减少闪烁并保存小程序的先前状态(即小程序的绘制内容)

但是如果我绘制第一个矩形,代码就可以正常工作。如果我开始绘制第二个矩形,则先前绘制的矩形就会消失。我希望之前绘制的矩形出现在屏幕上

请告诉我如何解决这个问题。

最佳答案

您需要做的是将之前绘制的矩形保存在某种数据结构中,以便稍后再次绘制。

这段代码(抱歉长度太长,将执行与您所描述的类似的操作。
要使用它,只需将 JPanel 放入 JFrame 中即可。

public class DrawPane extends JPanel {

    private List<DrawnShape> drawings;
    private DrawnShape curShape;

    public DrawPane() {
        drawings = new ArrayList<DrawnShape>();
        setBackground(Color.WHITE);
        setPreferredSize(new Dimension(300, 300));
        addMouseListener(clickListener);
        addMouseMotionListener(moveListener);
    }

    @Override
    protected void paintComponent(Graphics g2) {
        super.paintComponent(g2);
        Graphics2D g = (Graphics2D) g2;
        for (DrawnShape s : drawings) {
            s.draw(g);
        }
        g.setColor(Color.BLACK);
        g.setStroke(new BasicStroke(2));

        if (curShape == null)
            return;
        curShape.draw(g);
    }

    private MouseListener clickListener = new MouseAdapter() {

        @Override
        public void mousePressed(MouseEvent e) {
            curShape = new DrawnShape(e.getPoint(), e.getPoint());
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            drawings.add(new DrawnShape(curShape.getClickP(), e.getPoint()));
            curShape = null;
        }
    };

    private MouseMotionListener moveListener = new MouseMotionListener() {

        @Override
        public void mouseDragged(MouseEvent e) {
            curShape = new DrawnShape(curShape.getClickP(), e.getPoint());
            repaint();
        }
        @Override
        public void mouseMoved(MouseEvent e) {
        }
    };
}

class DrawnShape {

    private Point p1, p2;

    public DrawnShape(Point p1, Point p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    public Point getClickP() {
        return p1;
    }

    public void draw(Graphics2D g) {
        g.drawLine(p1.x, p1.y, p2.x, p1.y);
        g.drawLine(p1.x, p1.y, p1.x, p2.y);
        g.drawLine(p2.x, p2.y, p2.x, p1.y);
        g.drawLine(p2.x, p2.y, p1.x, p2.y);
    }
}

关于java - 在Java中的JFrame上拖动矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1150084/

相关文章:

java - 有时会自动调用 repaint() 吗?

java - 在 Graphics2D 中旋转动画线 (Java)

java - char 到 KeyEvent int

java - 在java中四舍五入并计算小数点后有多少个数字

Java/XML问题

java - 从 JTable 中删除渲染器

Java - 将值输入 JTextArea 后事件之间的延迟

Java - 无法在 BufferedReader 中正确读取特殊字符

Java 在流中丢失国际字符

java - Java中的简单GUI问题