【问题标题】:Utilising both a mouse listener and key listener in Java在 Java 中同时使用鼠标监听器和按键监听器
【发布时间】:2012-12-08 11:58:48
【问题描述】:

我有一个程序可以将一个对象向左或向右移动。 我想利用它,以便它同时与鼠标侦听器和按键侦听器一起使用。使用左箭头键和鼠标左键单击执行相同的选项。鼠标右键或箭头键反之亦然。 我的代码目前看起来有点像这样,我已经删掉了一些不必要的部分。

public class TetrisApplet extends JApplet implements MouseListener, KeyListener {

public void init() {

        tetris.addMouseListener(this);
        tetris.addKeyListener(this);

public void mouseReleased(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON1) {
            if (x > 0 && a[x - 1][y] == 0) {
                shape.move(-20, 0);
                x--;
            }
        }
        if (e.getButton() == MouseEvent.BUTTON3) {
            if (x < 9 && a[x + 1][y] == 0) {
                shape.move(+20, 0);
                x++;
            }
        }

    }

    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        switch (keyCode) {
            case KeyEvent.VK_LEFT:
                if (x > 0 && a[x - 1][y] == 0) {
                    shape.move(-20, 0);
                    x--;
                }
                break;
            case KeyEvent.VK_RIGHT:
                if (x < 9 && a[x + 1][y] == 0) {
                    shape.move(+20, 0);
                    x++;
                }
                break;
        }
    }

所以我的问题是,有没有人知道为什么它不适用于钥匙?我的程序允许使用鼠标单击来移动对象,但是按下左箭头和右箭头键绝对没有任何作用。而且我不知道为什么它不起作用。我知道我可能只是缺少一些小东西,但非常感谢任何帮助。

【问题讨论】:

    标签: java swing focus keylistener mouselistener


    【解决方案1】:

    我认为问题与焦点有关。具有焦点的组件获取关键事件,而不是您的 tetris 组件(它没有任何方法来获取焦点)。

    快速解决方法是添加:

    tetris.requestFocus();
    

    init 方法中,因为您希望焦点从 正确 组件 (?) 和 mouseReleased 开始,因为您希望能够再次获得焦点。

    【讨论】:

    • @JamesWarner:如果你搜索这个主题,你会发现使用 Key Bindings(查看教程)比使用 KeyListener 和 Swing 应用程序要好得多。
    猜你喜欢
    • 1970-01-01
    • 2014-12-13
    • 2014-02-21
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2015-11-30
    相关资源
    最近更新 更多