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

标签 java multithreading applet mouselistener

我正在关注这个[这里有点旧的 2d java 游戏教程][1]。

我有一个基本的小程序,它在带有鼠标监听器的线程中运行。

单击左键我可以从窗口底部射出最多 10 个泥鸽(球)。在右键单击我“射击”,如果我击中了一只鸽子,它就会从屏幕上移除。

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

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

欢迎提供有关如何调试的任何提示!

********* 编辑***********

好的,我已经采纳了下面给出的非常好的建议,并将代码缩减为能够重现该错误的最小概括。我想我的想法是所有的 for 循环和复杂性导致了问题,这就是为什么我在我的第一个代码中包含了这么多。

所以碰巧我几乎可以不用代码重现这个错误,但同时这个错误要温和得多。使用下面的代码,我只有基本的小程序和鼠标监听器,右键单击控制台中的计数增量并将其值打印到屏幕。这在大多数情况下工作正常,但时不时地,右键单击“丢失”并且未注册。

在整个类(class)中,我有时会得到 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) { }
}

最佳答案

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

关于java - 为什么这个 java applet 代码没有获取每个 MouseClicked 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10471983/

相关文章:

Python:停止正在等待用户输入的线程

Java 小程序 cookie

java - Visual Studio Code 无法处理 Java

java - 将 Scalatest 包含在 Java 中时 Maven 构建失败

java - 更改多个 Java 实例中的变量

Java 未签名 Applet - 传递 VM 参数 "java.security.policy"被忽略?

java - EC2 实例上从 Applet 到 JBoss 的 JNDI 查找

java - Java排列程序详解

Java使代理套接字多线程

python - 如何测量循环中创建的多线程所花费的时间?