繁体   English   中英

密钥保持时执行某些操作,并在其释放和压缩时重复执行操作

[英]do something once the key is held and repeat when its released and repressed

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

我用按键来获取我想要与之关联的按钮。 我还使用了一个信号量来克服这个问题,但它看起来很疯狂

我的代码:`

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”键并按住它时,它会打印:false true false true false

提前致谢。

这对我来说很好

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");

                }

            }

        });

    }

}

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

看到

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM