Java拖动绘制的球

时间:2012-11-07 18:16:25

标签: java jpanel mousemotionevent

我创建了一个程序,当我点击屏幕时画一个圆圈。我有它的工作,所以我可以画出尽可能多的圆圈。我甚至可以拖动一个圆圈而不是其他圆圈,如果我硬编码我拖动哪个圆圈。代码是:

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(),但它似乎不适用于我的圈子,至少不是我期望的方式。谢谢你的帮助。

3 个答案:

答案 0 :(得分:2)

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

然后,您可以通过将distance formula应用到您点击的点以及每个球的中心点来计算您是否点击圆圈内部。

距离小于半径的第一个球是你点击的球。或者,如果你想要更复杂,那么距离小于半径的球就是你点击过的球。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以修改Ball课程以利用Shape's API并使用Ellipse2D来维护圆圈的坐标并进行渲染。

然后,您只需使用Ellipse2D#contains来确定是否点击了形状。

你必须循环检查每一个球,直到你到达终点或找到​​你想要的球