我有一个带有Canvas的JFrame(亵渎,我知道)。 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());
}
}
答案 0 :(得分:1)
原来这个错误是由与osx上的重音菜单的一些狡猾的互动引起的。系统默认设置(至少对Yosemite而言)是当您按住一个字母键时弹出一个菜单,为您提供重音元音。虽然它没有显示菜单,但它必须在幕后做一些与焦点相混淆的事情。
Turning off the accents menu解决了这个问题。对于那些不愿意点击的用户,请在终端中键入以下内容。
defaults write -g ApplePressAndHoldEnabled -bool false