我创建了一个程序,当我点击屏幕时画一个圆圈。我有它的工作,所以我可以画出尽可能多的圆圈。我甚至可以拖动一个圆圈而不是其他圆圈,如果我硬编码我拖动哪个圆圈。代码是:
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(),但它似乎不适用于我的圈子,至少不是我期望的方式。谢谢你的帮助。
答案 0 :(得分:2)
修改Ball类,使其根据中心点和半径创建一个圆,而不是左上角和直径。
然后,您可以通过将distance formula应用到您点击的点以及每个球的中心点来计算您是否点击圆圈内部。
距离小于半径的第一个球是你点击的球。或者,如果你想要更复杂,那么距离小于半径的球就是你点击过的球。
答案 1 :(得分:0)
在这种情况下,事件源是JPanel,而不是Ball。尝试在mouseDragged()方法中添加System.out.println(event.getSource());
以便自己查看。正如其他人所建议的那样,只需计算从鼠标按下的点到圆圈的距离。基于中心/半径将使数学更容易。
答案 2 :(得分:0)
您可以修改Ball
课程以利用Shape's API并使用Ellipse2D
来维护圆圈的坐标并进行渲染。
然后,您只需使用Ellipse2D#contains
来确定是否点击了形状。
你必须循环检查每一个球,直到你到达终点或找到你想要的球