0

我创建了一个程序,当我点击屏幕时会画一个圆圈。我让它工作,这样我就可以画出尽可能多的圆圈。如果我对要拖动的圆圈进行硬编码,我什至可以拖动一个圆圈而不是其他圆圈。代码是:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.List;
import java.util.ArrayList;

public class DrawBall extends JPanel implements MouseListener, MouseMotionListener {
private List<Ball> balls;
private int x, y;
private int numBalls = 0;
boolean drag = false;

public static void main(String[] args) {
    javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGUI();
        }
    });
}

private static void createAndShowGUI() {
    JFrame frame = new JFrame("Draw Ball");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    JComponent newContentPane = new DrawBall();
    newContentPane.setOpaque(true);
    frame.setContentPane(newContentPane);
    frame.setSize(300, 300);
    frame.setVisible(true);
}

public DrawBall() {
    super(new BorderLayout());
    balls = new ArrayList<Ball>(10);
    addMouseListener(this);
    addMouseMotionListener(this);
}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2d = (Graphics2D) g.create();
    g2d.setRenderingHint(RederingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    for(Ball ball: balls) {
        ball.paint(g2d);
    }
    g2d.dispose();
}

public void mouseClicked(MouseEvent event) {
    x = (int) event.getPoint().getX();
    y = (int) event.getPoint().getY();
    Ball ball = new Ball(Color.red, numBalls, 30);
    ball.setX(x);
    ball.setY(y);
    balls.add(ball);
    numBalls = numBalls + 1;
    repaint();
}

public void mousePressed(MouseEvent event) {
    drag = true;
}

public void mouseReleased(MouseEvent event) {
    drag = false;
}
public void mouseEntered(MouseEvent event) {}
public void mouseExited(MouseEvent event) {}

public void mouseDragged(MouseEvent event) {
    if(drag == true) {
        x = (int) event.getPoint().getX();
        y = (int) event.getPoint().getY();
        if(event.getSource() == balls.get(0)) {
            Ball ball = balls.get(0);
            ball.setX(x);
            ball.setY(y);
            balls.set(0,ball);
        }
        repaing();
    }
}

public void mouseMoved(MouseEvent event) {}

public class Ball {
    private Color color;
    private int x, y, diameter, id;

    public Ball(Color color, int id, int diameter) {
        setColor(color);
        setID(id);
        setDiameter(diameter);
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public void setID(int id) {
        this.id = id;
    }

    public void setDiameter(int diameter) {
        this.diameter = diameter;
    }

    public void setColor(Color color) {
        this.color = color;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public int getID() {
        return id;
    }

    public int getDiameter() {
        return diameter;
    }

    public Color getColor() {
        return color;
    }

    protected void paint(Graphics2D g2d) {
        int x = getX();
        int y = getY();
        g2d.setColor(getColor());
        g2d.fillOval(x, y, getDiameter(), getDiameter());
    }
}
}

我的问题是:在我的 mouseDragged 方法中,有没有一种简单的方法可以判断我悬停在哪个圆圈上?我玩过 event.getSource() ,但它似乎对我的圈子不起作用,至少不是我期望的那样。谢谢你的帮助。

4

3 回答 3

2

修改您的 Ball 类,使其基于中心点和半径创建一个圆,而不是左上角点和直径。

然后,您可以通过将距离公式依次应用到您单击的点和每个球的中心点来计算您是否在圆内单击。

距离小于半径的第一个球是您点击的球。或者,如果您想要更复杂,距离小于半径的最小距离的球就是您单击的球。

于 2012-11-07T18:23:35.370 回答
0

您可以修改您Ball的类以利用Shape 的 API,并使用 anEllipse2D来维护圆的坐标并渲染它。

然后,您可以简单地使用Ellipse2D#contains来确定形状是否被单击。

您将不得不循环检查每一个球的集合,直到您到达终点或找到​​您正在寻找的球

于 2012-11-07T19:47:43.237 回答
0

在这种情况下,事件源是 JPanel,而不是 Ball。尝试System.out.println(event.getSource());在您的 mouseDragged() 方法中添加一个以亲自查看。正如其他人所建议的那样,只需计算从鼠标按下的点到您的圆圈的距离。基于中心/半径将使数学更容易。

于 2012-11-07T18:36:51.323 回答