2012-11-07 83 views
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(),但它似乎并没有为我的圈子工作,至少不是我所期望的。谢谢你的帮助。

回答

2

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

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

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

+0

我很害怕,这是我必须做的球。我希望有一个解决方案,我不必循环整个列表。噢,谢谢。 – nomad2986

0

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

0

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

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

你将不得不遍历球的集合逐项检查,直到您到达终点或找到​​你正在寻找