Сделать что-то, когда ключ удерживается, и повторить, когда он отпущен и нажат
Мне нужно проверить, когда пользователь нажимает на клавишу и отпускает ее. Если ключ удерживается, я сделаю что-то один раз.
Я использовал нажатие клавиши, чтобы получить кнопку, с которой я хочу связать действие. Я использовал также семафор, чтобы преодолеть эту проблему, но это выглядит сумасшедшим
Мой код: `
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.
Увидеть