【问题标题】:do something once the key is held and repeat when its released and repressed按住键后执行某些操作,并在松开和按下键时重复
【发布时间】:2012-08-11 20:25:07
【问题描述】:

我需要检查用户何时按下某个键并释放它。 如果有钥匙,我会做一次。

我使用击键来获取我想要关联动作的按钮。 我也使用信号量来解决这个问题,但它看起来很疯狂

我的代码: `

InputMap inputMap = jPanel1.getInputMap();
KeyStroke keyPressed = KeyStroke.getKeyStroke(KeyEvent.VK_1, 0, false);
KeyStroke keyReleased = KeyStroke.getKeyStroke(KeyEvent.VK_1, 0, true);
//------------------------------------------
jPanel1.getActionMap().put("_1000Press", _1000Press);
inputMap.put(keyPressed, "_1000Press");
jPanel1.getActionMap().put("_1000Release", _1000Release);
inputMap.put(keyReleased, "_1000Release");
public Action _1000Press = new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent e) {
        if(!one){
            // do some thing
            one = true;
            System.out.println(one);
        }
    }
};
public Action _1000Release = new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent e) {
        one = false;
        System.out.println(one);
    }
};

`

当我按下“1”键并按住它时,它会打印: 错误的 真的 错误的 真的 错误的 真的

提前致谢。

【问题讨论】:

  • KeyEvent.VK_1, 0, falseKeyEvent.VK_1, 0, true,不是吗
  • 我试过了,但它不起作用不知道为什么:S

标签: java swing key-bindings keystroke


【解决方案1】:

这对我来说很好用

InputMap im = getInputMap();
ActionMap am = getActionMap();

im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0, false), "Press");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0, true), "Release");

am.put("Press", new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent e) {

        if (!pressed) {

            pressed = true;
            System.out.println("press");

        }

    }

});

am.put("Release", new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent e) {

        if (pressed) {

            pressed = false;
            System.out.println("release");

        }

    }

});

只是为了确保我这样做

am.put("Release", new AbstractAction() {

    @Override
    public void actionPerformed(ActionEvent e) {

        pressed = false;
        System.out.println("release");

    }

});

它仍然有效

当我按住 1 时打印press,然后当我释放键时打印release。这是我得到的唯一输出

已更新完整代码

public class TestPane extends JPanel {

    private boolean pressed;

    public TestPane() {

        InputMap im = getInputMap();
        ActionMap am = getActionMap();

        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0, false), "Press");
        im.put(KeyStroke.getKeyStroke(KeyEvent.VK_1, 0, true), "Release");

        am.put("Press", new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent e) {

                if (!pressed) {

                    pressed = true;
                    System.out.println("press");

                }

            }

        });

        am.put("Release", new AbstractAction() {

            @Override
            public void actionPerformed(ActionEvent e) {

                if (pressed) {

                    pressed = false;
                    System.out.println("release");

                }

            }

        });

    }

}

【讨论】:

  • 你使用什么平台?我使用 ubuntu 12.04 和 netbeans,你的代码对我不起作用
  • 啊,我使用的是 Windows :P(使用 Netbeans)——我会看看我的 Mac 是否也能做同样的事情
  • @MahmoudHosny 在 MacOS X Lion 下尝试了这两个示例,没有问题。抱歉,看起来像是 Ubuntu 的问题。我在 Windows 下使用 JDK1.6.0_24 和 Mac 下使用 JDK1.6.0_33 进行测试。我什至在 Windows 下尝试过 JDK1.7.0,它们都可以正常工作
  • 当然,我想我可能需要让它focusable,但它工作得很好——我添加了完整的代码以防万一
【解决方案2】:

我不相信你可以在 Linux 中实现你所需要的,因为操作系统不断地向 JVM 发出按下/释放信号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多