JAVA – 如何在每次单击鼠标时创建新线程


java中,如何在每次单击鼠标时将球丢弃到面板?假设我点击面板3次,所以面板上应该有3个球弹跳.

我有这个代码块:

ball = new Thread() {
    public void run() {
        while (true) { 
            x += speedX;
            y += speedY;
        }
    }
};
ball.start();

repaint();
try {Thread.sleep(100/3);}catch(InterruptedException ex){}

以及绘球的方法:

public void paintComponent(Graphics ball) {
  super.paintComponent(ball);
  if(clicks>0){
    ball.setColor(Color.BLUE);
    ball.fillOval((int) (x - rad), (int) (y - rad), (int)(2 * rad), (int)(2 * rad));
  }
}

但是这个线程只丢掉了1个球.我也尝试了一系列线程,但它没有用.

最佳答案 >显然,您需要为每个球保留不同的(x,y)数据,例如:有一个带有x,y的Ball类,然后是List< Ball>

(除非你打算让它们计算出来,即有一个x,y,球的计算方向与它有一些偏差)

>在paintComponent上你需要绘制所有球,这意味着’fillOval’的一些循环
>在更改x和y后,您的线程需要调用’repaint’.
它还需要一些“睡眠”,否则球会跑得太快.
>关于线程,我有点同意MadProgrammer:你可以有一个单一的线程迭代所有的球并推进他们的coordiantes.但是你需要几个线程(用于练习,或者为了更好的未来控制)它应该可以正常工作,只要每个线程都知道它负责哪个球.所以它就像是

List<Ball> balls= ...;

Class BallRunnable implements Runnable{
  private Ball ball;
  private JComponent comp; // the one whose paintComponent does fillOval
  public BallRunnable(Ball ball, JComponent comp){
    this.ball=ball;
  }
  public void run(){
     while(true){
        ball.x +=speedX; ball.y+= speedY;
        Thread.sleep(200);
        comp.repaint();
     }
  }
}
点赞