Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java简单弹跳球,单线程,鼠标侦听器,JFrame_Java_Multithreading_Swing_Mouselistener - Fatal编程技术网

Java简单弹跳球,单线程,鼠标侦听器,JFrame

Java简单弹跳球,单线程,鼠标侦听器,JFrame,java,multithreading,swing,mouselistener,Java,Multithreading,Swing,Mouselistener,我已经用Java创建了一个弹跳球应用程序。我们的目标是让一个球出现在mousePressed()上,让它在不离开框架的情况下从墙上弹起。只有一个球一根线,应该很容易我的问题是每次我点击使球看起来更快,我不知道为什么。有人能帮我吗。附言:我是个新手 导入java.awt.Graphics; 导入java.awt.event.MouseEvent; 导入java.awt.event.MouseListener; 导入javax.swing.JFrame; 导入javax.swing.JPanel;

我已经用Java创建了一个弹跳球应用程序。我们的目标是让一个球出现在
mousePressed()
上,让它在不离开框架的情况下从墙上弹起。只有一个球一根线,应该很容易我的问题是每次我点击使球看起来更快,我不知道为什么。有人能帮我吗。附言:我是个新手

导入java.awt.Graphics;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseListener;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类MyFrame扩展了JPanel{
公共int XPO,YPO,xDir=3,yDir=4;
公共内径=50;
公共MyFrame(){
最终JFrame thisFrame=新JFrame();
thisFrame.add(这个);
thisFrame.setTitle(“弹跳球”);
thisFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
thisFrame.setLocationRelativeTo(空);
此帧。设置大小(500500);
this.addMouseListener(新的MouseListener(){
@凌驾
公共无效MouseEvent e{}
@凌驾
公共无效鼠标按下(MouseEvent e){
xPos=e.getX();
yPos=e.getY();
线程t=新线程(){
@凌驾
公开募捐{
while(true){
试一试{
睡眠(10);
}捕获(例外e){};
xPos+=xDir;
yPos+=yDir;

如果每次单击(xPos+diameter>=thisFrame.getWidth()-25 | | xPos=thisFrame.getHeight()-diameter | | yPos,则表示您正在启动一个新线程,这意味着您有另一个线程更新x/y位置

例如,1个线程意味着每次同步更新一次x/p,2个线程意味着每个周期至少更新两次x/y位置,而这一点在每次添加新线程时都会变得复杂

更好的解决方案是在更早的某个时间启动
线程
,然后使用
列表
来保持球的位置和方向

这将需要一点同步来保证安全


仅供参考,40毫秒的延迟约为25 fps,16毫秒的延迟约为60 fps。IMHO,对于您正在做的事情,10毫秒似乎过多了…

在将来不需要重写每个鼠标事件方法时使用
MouseAdapter
。如果我理解正确,每次单击,前一个线程都不会死亡。导致多线程…?如果我有点困惑,对不起。你是说我应该在按下鼠标外初始化线程,然后在按下鼠标后启动它吗?如果是这样的话,我会在再次启动之前终止它吗?谢谢你的帮助。第一部分是肯定的。第二部分将取决于你想做什么。如果你继续如果你想要更多的球,那么你需要使用某种列表来维护管理每个球所需的信息。我还应该指出,javax.swing.Timer更容易管理,从更新的角度来看更安全。我修复了它n、 非常感谢。我将在一分钟内测试并发布更新的代码。再次感谢您的帮助。我明天会发布它,因为我没有足够的声誉来回答我自己的问题。QQ。