鼠标侦听器不会引发错误但不会触发(java)

Posted

技术标签:

【中文标题】鼠标侦听器不会引发错误但不会触发(java)【英文标题】:Mouse listener throws no errors but doesn't fire (java) 【发布时间】:2020-09-16 05:44:41 【问题描述】:

我正在关注在geeksforgeeks 上找到的代码,但鼠标侦听器没有触发。我怀疑 runnable 的实现以某种方式锁定了对我的板对象的访问,但我不确定。我和this post 的 OP 有类似的情况。

public class Game extends Canvas implements MouseListener 

    JFrame jf = new JFrame();

    Game() 
        jf.getContentPane().add(this, BorderLayout.CENTER);
        jf.setSize(new Dimension(500,500+30));
        jf.setVisible(true);
        jf.addMouseListener(this);
    

    public void mouseClicked(MouseEvent e)
        System.out.println("Hello World!");
    

    public void mousePressed(MouseEvent e)

    public void mouseReleased(MouseEvent e)

    public void mouseEntered(MouseEvent e)

    public void mouseExited(MouseEvent e)

    public static void main(String[] args)
        Game game = new Game();
    

我怀疑但怀疑鼠标侦听器可能无法正常运行,因为它是在非静态方法中创建的,但我怀疑这就是问题所在。我尝试将声明移到构造函数的开头,但这没有帮助。

【问题讨论】:

“我的辅助课程在我的 Github 项目中” 请不要将代码发布到外部站点。为了获得更好的帮助,请尽快发布正确的minimal reproducible example。很少有人会经历理解您的整个项目和辅助类的麻烦。如果与问题无关,则将问题隔离在单个文件中(如果可能,单个类),无需自定义颜色、字体、图像等。要测试 MouseListener,我建议您 1) 将其更改为 MouseAdapter,它已经对所有方法进行了空实现,因此您的代码中没有这些空方法 2) 使用可以单击的图像/形状创建一个类,将MouseAdapter 添加到其中,然后查看问题是否仍然存在,如果没有,则可以检查两者之间的差异代码(原始代码与虚拟代码),如果您无法用您的知识解决它,那么 3) 再次回来,edit 您的问题包括包含我们需要复制粘贴并在我们的计算机中运行它的所有内容的虚拟代码,不做任何修改。 顺便说一句,为什么要将 AWT 组件 (Canvas) 与 Swing 组件 (JFrame) 混合使用。 AWT 不再受支持和错误,从 Canvas 切换到 JPanel,它增加了更多功能并且是一个 Swing 组件。 Thread.sleep() 可能会阻塞 EDT,并且所有自定义绘画都应该在 paintComponent() 方法中完成(内部调用 paint(),而不是在 paint() 中并在您这样做时调用 super.paintComponent() 作为第一行 很抱歉,我不知道最小可复制示例,我将更改我的问题以删除它。感谢您提请我注意。 【参考方案1】:

事件只会在有焦点的组件上注册。其中,在您的程序中是您的主面板,Game 类。所以一个快速的解决方法就是改变:

 jf.addMouseListener(this);

addMouseListener(this);

但是您应该将侦听器添加到您可能想要获取事件的任何组件,即您的主面板、内容窗格和 jframe。

【讨论】:

【参考方案2】:

问题在于使用 Canvas 而不是 JPanel 作为超类。当我切换时,鼠标监听器开始触发。

【讨论】:

以上是关于鼠标侦听器不会引发错误但不会触发(java)的主要内容,如果未能解决你的问题,请参考以下文章

调度 KeyEvent(或任何类型的事件?)时不会通知侦听器

使用名称中的点调度 CustomEvent 不会触发 jQuery.on() 事件侦听器

单击侦听器事件不会在 SVG 元素上触发(字体真棒图标)

当应用程序打开或应用程序处于后台时,Phonegap Firebase 推送通知不会触发事件侦听器

简单的按键不会触发任何监听器

Video.js - 加载元数据事件永远不会触发