Сделать что-то, когда ключ удерживается, и повторить, когда он отпущен и нажат

Мне нужно проверить, когда пользователь нажимает на клавишу и отпускает ее. Если ключ удерживается, я сделаю что-то один раз.

Я использовал нажатие клавиши, чтобы получить кнопку, с которой я хочу связать действие. Я использовал также семафор, чтобы преодолеть эту проблему, но это выглядит сумасшедшим

Мой код: `

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 false true false true

Заранее спасибо.

2 ответа

Это прекрасно работает для меня

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

    }

});

И это все еще работало

напечатанный press когда я нажал и удерживал 1, а затем напечатал 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.

Увидеть

Другие вопросы по тегам