我用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();
}
}
答案 0 :(得分:1)
每次点击,你都会开始一个新线程,这意味着你有另一个线程更新x / y位置。
例如,1个线程意味着每次同步更新x / p一次,2意味着每个周期更新x / y位置至少两次,这样每次你都会复合添加新帖子。
更好的解决方案是提前一段时间开始Thread
,然后使用List
来保持球的位置和方向。
这需要一点但同步才能保证安全
FYI延迟40毫秒约为25 fps,16毫秒约为60 fps。恕我直言,你正在做的事情,10毫秒似乎过度......