Java 在鼠标拖动事件时制作圆,然后移动圆

Java 在鼠标拖动事件时制作圆,然后移动圆,java,swing,mouseevent,geometry,paintcomponent,Java,Swing,Mouseevent,Geometry,Paintcomponent,在Java中,如何在鼠标拖动事件上绘制圆,然后如何在鼠标拖动事件上移动该圆 我的代码如下 import java.awt.*; import java.awt.event.*; import javax.swing.*; class r extends JPanel { public int x1, x2, y1, y2, r, w, h,xDist,yDist; public static boolean flag = false, pressFlag = false;

在Java中,如何在鼠标拖动事件上绘制圆,然后如何在鼠标拖动事件上移动该圆

我的代码如下

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

class r extends JPanel {

    public int x1, x2, y1, y2, r, w, h,xDist,yDist;
    public static boolean flag = false, pressFlag = false;

    public r() {
        setBackground(Color.WHITE);
        addMouseListener(new MouseAdapter() {

            public void mousePressed(MouseEvent m) {
//                pressFlag = true;
                if (r > (int) Math.sqrt(Math.abs(m.getX() - x1) * Math.abs(m.getX() - x1) + Math.abs(m.getY() - y1) * Math.abs(m.getY() - y1))) {
                    flag = true;
                    yDist=xDist=x2 = y2 = 0;
                } else {
                    x1 = y1 = 0;
                    r=x2 = y2 = 0;
                    x1 = m.getX();
                    y1 = m.getY();
                }
                 repaint();
            }

            public void mouseReleased(MouseEvent m) {
                w = x2 - x1;
                h = y2 - y1;
                r = (int) Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));
                flag = false;
            }
        });
        addMouseMotionListener(new MouseMotionAdapter() {

            public void mouseDragged(MouseEvent m) {
                if (flag && (x2!=0 && y2!=0)) {
                    xDist=(m.getX()-x2);
                    yDist=(m.getY()-y2);
                }
                x2 = m.getX();
                y2 = m.getY();

                repaint();
            }
        });
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (flag) {
            x1=x1+xDist;
            y1=y1+yDist;
            g.drawOval(x1, y1, w, h);
        } else {
            g.drawOval(x1, y1, x2 - x1, y2 - y1);
        }

    }
}

public class q extends JFrame {

    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        jFrame.setSize(300, 300);
        jFrame.add(new r());
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

这方面的东西对我来说很好:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

class DragCircle extends JPanel {

    private final class MouseDrag extends MouseAdapter {
        private boolean dragging = false;
        private Point last;

        @Override
        public void mousePressed(MouseEvent m) {
            last = m.getPoint();
            dragging = isInsideEllipse(last);
            if (!dragging) {
                x = last.x;
                y = last.y;
                width = 0;
                height = 0;
            }
            repaint();
        }

        @Override
        public void mouseReleased(MouseEvent m) {
            last = null;
            dragging = false;
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent m) {
            int dx = m.getX() - last.x;
            int dy = m.getY() - last.y;
            if (dragging) {
                x += dx;
                y += dy;
            } else {
                width += dx;
                height += dy;
            }
            last = m.getPoint();
            repaint();
        }
    }

    private int x;
    private int y;
    private int width;
    private int height;

    private MouseDrag mouseDrag;

    public DragCircle() {
        setBackground(Color.WHITE);
        mouseDrag = new MouseDrag();
        addMouseListener(mouseDrag);
        addMouseMotionListener(mouseDrag);
    }

    public boolean isInsideEllipse(Point point) {
        return new Ellipse2D.Float(x, y, width, height).contains(point);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawOval(x, y, width, height);
    }

    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        jFrame.setSize(300, 300);
        jFrame.add(new DragCircle());
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

这方面的东西对我来说很好:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

class DragCircle extends JPanel {

    private final class MouseDrag extends MouseAdapter {
        private boolean dragging = false;
        private Point last;

        @Override
        public void mousePressed(MouseEvent m) {
            last = m.getPoint();
            dragging = isInsideEllipse(last);
            if (!dragging) {
                x = last.x;
                y = last.y;
                width = 0;
                height = 0;
            }
            repaint();
        }

        @Override
        public void mouseReleased(MouseEvent m) {
            last = null;
            dragging = false;
            repaint();
        }

        @Override
        public void mouseDragged(MouseEvent m) {
            int dx = m.getX() - last.x;
            int dy = m.getY() - last.y;
            if (dragging) {
                x += dx;
                y += dy;
            } else {
                width += dx;
                height += dy;
            }
            last = m.getPoint();
            repaint();
        }
    }

    private int x;
    private int y;
    private int width;
    private int height;

    private MouseDrag mouseDrag;

    public DragCircle() {
        setBackground(Color.WHITE);
        mouseDrag = new MouseDrag();
        addMouseListener(mouseDrag);
        addMouseMotionListener(mouseDrag);
    }

    public boolean isInsideEllipse(Point point) {
        return new Ellipse2D.Float(x, y, width, height).contains(point);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawOval(x, y, width, height);
    }

    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        jFrame.setSize(300, 300);
        jFrame.add(new DragCircle());
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

糟糕的命名约定!是的,但我只是修改了代码。在我的代码中,我先画圆,然后在鼠标拖动事件时移动那个圆。但它不会像光标一样移动。所以我必须做什么?什么不起作用?我刚试过你的代码,效果不错。请移动快速循环或快速拖动循环。你可以看到问题所在。@Jay抱歉,但即使我两个动作都“快速”,我也没有任何问题。可能在很短的一段时间内(几毫秒),绘图并不“精确”在我的鼠标指针所在的位置,但当我减速时,一切都会恢复正常,显示再次正确。可怕的命名约定!是的,但我只是修改了代码。在我的代码中,我先画圆,然后在鼠标拖动事件时移动那个圆。但它不会像光标一样移动。所以我必须做什么?什么不起作用?我刚试过你的代码,效果不错。请移动快速循环或快速拖动循环。你可以看到问题所在。@Jay抱歉,但即使我两个动作都“快速”,我也没有任何问题。可能在很短的一段时间内(几毫秒),绘图并不“精确”在我的鼠标指针所在的位置,但只要我放慢速度,一切都会恢复正常,显示也会正确。@Jay我想你的计算中出现了一些问题,是的,没错。我会解决这个错误。再次感谢你对我的帮助。@Jay我想你的计算中有一些问题,是的,你是对的。我会解决这个错误。再次感谢你对我的帮助。