Java Simple Bouncing Ball,SingleThread,Mouse Listener,JFrame

时间:2014-01-17 20:14:36

标签: java multithreading swing mouselistener

我用Java创建了一个Bouncing Ball应用程序。目标是在mousePressed()上出现一个球并让它从墙上反弹而不离开框架。只有一个Ball One Thread,应该很容易.. 我的问题是,每次我点击使球出现时它会变得更快,我不知道为什么。有人可以帮助我。 PS:我是线程新手。

import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MyFrame extends JPanel {
public int xPos, yPos, xDir = 3, yDir = 4;
public int diameter = 50;

public MyFrame(){
    final JFrame thisFrame = new JFrame();
    thisFrame.add(this);
    thisFrame.setTitle("Bouncing Ball");
    thisFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    thisFrame.setLocationRelativeTo(null);
    thisFrame.setSize(500, 500);

    this.addMouseListener(new MouseListener() {
        @Override
        public void mouseReleased(MouseEvent e) {}
        @Override
        public void mousePressed(MouseEvent e) {
            xPos = e.getX();
            yPos = e.getY();
            Thread t = new Thread() {
                @Override
                public void run() {
                    while(true){
                        try{
                            Thread.sleep(10);
                        }catch(Exception e){};
                        xPos += xDir;
                        yPos += yDir;

                        if(xPos + diameter >= thisFrame.getWidth() - 25 || xPos <= 0) xDir = -xDir;
                        if(yPos + diameter >= thisFrame.getHeight() - diameter || yPos <= 0) yDir = -yDir;
                        repaint();
                    }
                } 
            };
            t.start();
        }
        @Override
        public void mouseExited(MouseEvent e) {}
        @Override
        public void mouseEntered(MouseEvent e) {}
        @Override
        public void mouseClicked(MouseEvent e) {}
        });

    thisFrame.setVisible(true);

    }
    public void paintComponent(Graphics g) { 
        super.paintComponent(g); 
        g.fillOval(xPos, yPos, diameter, diameter); 
    }
}
public class MyMain{

    public static void main(String[] args) {
        new MyFrame();
    }

}

1 个答案:

答案 0 :(得分:1)

每次点击,你都会开始一个新线程,这意味着你有另一个线程更新x / y位置。

例如,1个线程意味着每次同步更新x / p一次,2意味着每个周期更新x / y位置至少两次,这样每次你都会复合添加新帖子。

更好的解决方案是提前一段时间开始Thread,然后使用List来保持球的位置和方向。

这需要一点但同步才能保证安全

FYI延迟40毫秒约为25 fps,16毫秒约为60 fps。恕我直言,你正在做的事情,10毫秒似乎过度......