Canvas上的KeyListener:keyReleased触发,但没有keyPressed或keyTyped

时间:2014-11-24 23:14:14

标签: java macos swing canvas keylistener

我有一个带有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());
    }
}

1 个答案:

答案 0 :(得分:1)

原来这个错误是由与osx上的重音菜单的一些狡猾的互动引起的。系统默认设置(至少对Yosemite而言)是当您按住一个字母键时弹出一个菜单,为您提供重音元音。虽然它没有显示菜单,但它必须在幕后做一些与焦点相混淆的事情。

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

defaults write -g ApplePressAndHoldEnabled -bool false