当前位置: 首页 > 知识库问答 >
问题:

画布上的KeyListener:keyReleased触发,但没有按下keyPressed或keyTyped

郭元明
2023-03-14

我有一个带有画布的JFrame(亵渎,我知道)。画布有一个附加的MouseListener和KeyListener,并请求使用以下内容聚焦:

canvas.setFocusable(true);
canvas.requestFocusInWindow();

当我第一次运行它时,一切都像预期的那样,事件到处都是。几秒钟后,它停止响应正常的键输入(keyPressed和keyTyped不会被触发)。奇怪的是,拿着三叶草(我在OSX上)让一切正常工作。

有事吗?为什么会发生这种情况,我可以做些什么来修复它?

编辑:我已经搞清楚是什么行为触发了bug。只有当你按住一把钥匙时,它才开始发生。当您释放它时,keyPressed事件停止触发。下面是我的MCVE。

import java.awt.Canvas;
import java.awt.Graphics2D;
import java.awt.Dimension;
import java.awt.image.BufferStrategy;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class Listener implements MouseListener,KeyListener {

    JFrame frame;
    Canvas screen;

    public Listener() {
        // initialize the screen canvas
        screen = new Canvas();
        Dimension size = new Dimension(640, 480);
        screen.setMinimumSize(size);
        screen.setMaximumSize(size);
        screen.setPreferredSize(size);
        screen.addMouseListener(this);
        screen.addKeyListener(this);
        screen.setFocusable(true);

        // initialize the frame
        frame = new JFrame("Parasite");
        frame.add(screen);
        frame.pack();
        frame.setVisible(true);

        screen.requestFocusInWindow();

        // create buffer strategy (after showing frame)
        screen.createBufferStrategy(2);
    }

    public static void main(String[] args) {
        Listener listener = new Listener();
    }

    public void mouseClicked(MouseEvent e) {
        System.out.println("click");
    }

    public void mouseEntered(MouseEvent e) {}
    public void mouseExited(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}

    public void keyTyped(KeyEvent e) {
        System.out.println("t " + e.getKeyChar());
    }

    public void keyPressed(KeyEvent e) {
        System.out.println("p " + e.getKeyChar());
    }

    public void keyReleased(KeyEvent e) {
        System.out.println("r " + e.getKeyChar());
    }
}

共有1个答案

祁雪峰
2023-03-14

原来,这个错误是由与OSX上的accents菜单的一些不正当交互引起的。系统默认(至少对优胜美地来说)是当你按住字母键时,它会弹出一个菜单,为你提供重音元音。虽然它没有显示菜单,但它一定是在幕后做了什么,扰乱了焦点。

关闭重音菜单解决了这个问题。对于那些不愿意点击通过的人,请在您的终端中键入以下内容。

defaults write -g ApplePressAndHoldEnabled -bool false
 类似资料:
  • 我有一个通过顶点创建的 AWS lambda 函数。我还通过地球形态创建了一个SNS主题和订阅。 我的主题是: 我有一个订阅:<code>arn:aws:sns:ap-southeast-1:178284945954:fetch_realm_auctions:2da1d182-946d-4afd-91cb-1ed3453c5d86 我已经确认这是正确的函数ARN。一切似乎都连接正确: 我手动触发S

  • 我是一个新手,我正在尝试创建一个应用程序来在我的投资组合中使用。本质上,该程序是一个可以访问不同菜单的菜单(json文件:texas_pick.js,Breakth.js…),该程序旨在以按钮的形式显示菜单选项,按钮的详细信息从各自的json文件中检索。我面临的问题是,单击菜单选项时,会检索最后一个菜单项的数据。我将后端编程为只将商品名称和价格推送到数据库,而前端则检索这些数据并将其显示在表上。检

  • 问题内容: 永远不会在我的Angular控制器中触发。下列: 永远不会碰到断点,永远不会弹出警报。我认为这是非常标准的用法,所以我不确定它会是什么,但绝对不会触发。控制器中的其他所有内容均正常运行。 是什么原因造成的? 问题答案: 根据上面的评论,听起来您有这样的事情: 我不确定ng-view标记中的内容会做什么,但是是从ng-view范围 发出 的。这意味着,它只会从上升,因此您的控制器将永远不

  • 我正在制作一个有按钮的鼓应用程序,作为我的鼓。我想要的是按键会在按键时触发,这样用户就可以用键盘击鼓了。 我使用按钮的keyTyped事件来使用键执行声音。它工作得很好,但首先焦点需要首先在那个特定的按钮上,因此我不能在按键时触发这些单独的按钮,因为焦点只有一个按钮。 我能想到的解决方案是:在表单加载时应用多个焦点(如果可能),在按键时使用不同的方式触发按钮事件(而不是通过KeyListener和

  • 本节,我们将使用在画布上下文对象的transform()方法中已经学过的知识,来创建一个自定义的切割变换,使画布上下文在水平方向上发生倾斜。 图4-8 切割画布上下文 绘制步骤 按照以下步骤,绘制一个被切割的矩形: 1. 定义画布上下文及矩形尺寸: window.onload = function(){ var canvas  = document.getElementById("myCan

  • 除了平移和旋转,HTML5的画布API还提供了缩放画布上下文的手段。本节,我们将使用scale()方法来按比例缩小画布上下文的高度。 图4-5 缩放画布上下文 绘制步骤 按照以下步骤,绘制一个按比例缩小的矩形: 1. 定义画布上下文,及矩形的尺寸: window.onload = function(){ var canvas  = document.getElementById("myCan