为什么这个java applet代码没有拾取每个MouseClicked事件?

时间:2012-05-06 16:01:55

标签: java multithreading applet mouselistener

我正在关注这个[稍微老一点的2d java游戏教程] [1]。

我有一个基本的applet,它在一个带有mouselistener的线程中运行。

在左键单击时,我可以从窗口底部拍摄最多10个claypigeons(球)。在右键单击我“射击”,如果我击中一只鸽子,它将从屏幕上移除。

但是我注意到有时候右键点击不会被提起。这不一定是屏幕上有很多事情发生的,尽管从一开始就没有开始。在最坏的情况下,在注册之前可能需要3或4次点击。

我猜我在代码中做了一些明显错误的事情,但我不确定是什么。我的第一个想法是for循环遍历每个对象的每一帧重新计算他​​们的位置或检查他们是否已被“射击”?他们可能会“阻挡”mouselistener吗?!

欢迎任何有关如何调试此功能的提示!

** * ** * ** * 修改 * ** * ** * ** * < / EM> *

好的,我已经采取了下面给出的非常好的建议,并将代码缩减为最小的简单再现错误。我想我脑子里已经知道所有for循环和导致问题的复杂性,这就是为什么我在第一段代码中包含了这么多。

因此,我几乎没有代码可以重现这个错误,但同时它的bug也更温和。使用下面的代码,我只需要基本的applet和mouselistener,然后右键单击控制台中的计数增量并将其值输出到屏幕。这在大多数情况下都可以正常工作,但是不时地,右键单击“丢失”而未注册。

使用完整的课程,我有时可以获得3或4个或更多右键单击的序列,因此错误更加明显。无论如何代码如下,这次只有一个类:

主类代码:

package javacooperation;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;

public class ClayPigeonGame extends Applet implements Runnable, MouseListener {
    //counters and flags for debugging
    private boolean flag = true;
    private int click_count = 0;
    private boolean game_running;

    public void init(){
        //set boolean for while loop
        game_running=true;
        addMouseListener(this);
    }
    public void start() {
        //threading this applet.. why?
        Thread th = new Thread(this);
        //does this call the run method in the class?
        th.start();
    }

    public void stop(){
        game_running=false;
    }

    public void destroy() { }

    public void run(){
        while(game_running) {
            //updatePigeonPosition();
            repaint();
            try{
                //stop thread for 20 milliseconds
                Thread.sleep(20);
            } catch (InterruptedException ex){ }
        }
    }

    public void paint(Graphics g){  }

    public void mouseClicked(MouseEvent e) {
            switch (e.getButton()){
                case MouseEvent.BUTTON1:
                case MouseEvent.BUTTON2:
                    break;
                case MouseEvent.BUTTON3:
                    click_count ++;
                    System.out.println("Right click count: " + click_count);
                    break;
                default:
                    break;
            }
    }
    //all the mouse listening events required because we implemented MouseListener
    public void mouseReleased(MouseEvent e) { }
    public void mouseEntered(MouseEvent e) { }
    public void mousePressed(MouseEvent e) { }
    public void mouseExited(MouseEvent e) { }
}

1 个答案:

答案 0 :(得分:2)

我猜你的代码可能会干扰鼠标点击的检测时间,因为点击实际上既是按下又是正确边界的释放等等。您是否尝试过不使用点击后的回叫而是使用按下的(将代码移到mousePressed代替?)