【问题标题】:Java Simple Bouncing Ball, SingleThread, Mouse Listener, JFrameJava 简单弹跳球、单线程、鼠标监听器、JFrame
【发布时间】:2014-01-18 04:21:38
【问题描述】:

我用 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();
    }

}

【问题讨论】:

  • 以后在不需要覆盖每一个鼠标事件方法的时候使用MouseAdapter

标签: java multithreading swing mouselistener


【解决方案1】:

每次单击时,您都在启动一个新线程,这意味着您有另一个线程更新 x/y 位置。

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

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

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

仅供参考,40 毫秒的延迟大约是 25 fps,16 毫秒大约是 60 fps。恕我直言,对于您正在做的事情,10 毫秒似乎太长了...

【讨论】:

  • 如果我理解正确的话,每次点击前一个线程都不会死。导致多个线程...?对不起,如果我有点困惑。你是说我应该在鼠标按下时初始化线程并在鼠标按下时启动它?如果是这种情况,我是否必须在重新开始之前终止它?感谢您的帮助。
  • 第一部分是的。第二部分将取决于您想要做什么。如果你只想要一个球,那么。您可以简单地重置 x/y 位置,而不必担心其他任何事情。如果你想要更多的球,那么你需要使用某种列表来维护管理每个球所需的信息
  • 我还应该指出,从更新的角度来看,javax.swing.Timer 会更容易管理和更安全
  • 我修好了,非常感谢。我将对其进行测试并在一分钟内发布更新的代码。再次感谢您的帮助。
  • 好吧,我明天会发布它,因为我没有足够的声誉来回答我自己的问题。 QQ。
猜你喜欢
  • 2018-09-09
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多