gpt4 book ai didi

java - Canvas 上的 KeyListener : keyReleased triggering, 但没有 keyPressed 或 keyTyped

转载 作者:太空宇宙 更新时间:2023-11-04 06:23:38 26 4
gpt4 key购买 nike

我有一个 JFrame,里面有一个 Canvas(我知道这是亵渎)。 Canvas 有一个附加的 MouseListener 和 KeyListener,并通过以下方式请求焦点:

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

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

发生什么事了?为什么会发生这种情况以及我可以采取什么措施来解决它?

编辑:我已经弄清楚什么行为会触发该错误。只有当您按住某个键时,它才会开始发生。当您释放它时,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());
}
}

最佳答案

事实证明,该错误是由与 osx 上的重音菜单的一些不正当交互引起的。系统默认(至少对于优胜美地)是当您按住字母键时弹出一个菜单,为您提供重音元音。虽然它没有显示菜单,但它一定在幕后做了一些扰乱焦点的事情。

Turning off the accents menu解决了问题。对于那些不愿意点击的人,请在终端中输入以下内容。

defaults write -g ApplePressAndHoldEnabled -bool false

关于java - Canvas 上的 KeyListener : keyReleased triggering, 但没有 keyPressed 或 keyTyped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27115966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com