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

时间:2015-10-11 05:22:54

标签: java multithreading

在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个球。我也尝试了一系列线程,但它没有用。

2 个答案:

答案 0 :(得分:1)

  1. 显然,您需要为每个球保留不同的(x,y)数据,例如:有一个带有x,y的球类,然后是List<Ball>
  2. (除非你打算让它们计算出来,即有一个x,y,球的计算方向偏离它)

      在paintComponent上
    1. 你需要绘制所有球,这意味着'fillOval'的一些循环

    2. 您的帖子在更改x和y后需要调用'重绘'。 它还需要一些“睡眠”,否则球会跑得太快。

    3. 关于线程,我有点同意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();
           }
        }
      }
      

答案 1 :(得分:0)

必须通过将MouseListener设置到面板来定义面板的行为,以启动一个可以创建新球的新线程。

    final JPanel p = new JPanel();
    p.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {
            Thread ball = new Thread() {
                public void run() {
                    while (true) {
                        x += speedX;
                        y += speedY;
                    }
                }
            };
            ball.start();

            p.repaint();
        }

        @Override
        public void mousePressed(MouseEvent e) {

        }

        @Override
        public void mouseReleased(MouseEvent e) {

        }

        @Override
        public void mouseEntered(MouseEvent e) {

        }

        @Override
        public void mouseExited(MouseEvent e) {

        }
    });