Как KeyListener обнаруживает комбинации клавиш (например, ALT + 1 + 1)
Как я могу позволить своим пользовательским KeyListener
прослушивать комбинации ALT
(или CTRL
, если на то пошло) + более одного другого ключа?
Предположим, что у меня есть 11 различных действий, которые я хочу, чтобы приложение выполнялось в зависимости от комбинации нажатых клавиш. ALT + 0
- ALT + 9
, очевидно, не представляют никаких проблем, тогда как для ALT + 1 + 0
(или "ALT + 10", как это может быть описано в файле справки или аналогичном), я не могу найти хорошее решение в любом месте в Интернете ( или в моей голове). Я не уверен, что это решение с таймером является единственным возможным способом.
Спасибо за миллион за любые предложения!
Изменить: Действия 0-9 + действие 10 = 11 действий. Спасибо @X-Zero.
Ответы
Ответ 1
Вы не должны использовать KeyListener для этого типа взаимодействия. Вместо этого используйте привязки клавиш, о которых вы можете прочитать в Java Tutorial. Затем вы можете использовать маску InputEvent, чтобы отображать, когда различные ключи модификатора делятся. Например:
// Component that you want listening to your key
JComponent component = ...;
component.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
java.awt.event.InputEvent.CTRL_DOWN_MASK),
"actionMapKey");
component.getActionMap().put("actionMapKey",
someAction);
См. javadoc для KeyStroke для разных кодов, которые вы можете использовать при получении KeyStroke. Эти модификаторы могут быть OR' вместе, чтобы представлять различные комбинации клавиш. Например,
KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
java.awt.event.InputEvent.CTRL_DOWN_MASK
| java.awt.event.InputEvent.SHIFT_DOWN_MASK)
Представить, когда нажаты клавиши Ctrl + Shift
.
Изменить: Как было указано, это не отвечает на ваш вопрос, а вместо этого следует просто принять как хороший совет.
Ответ 2
Вы можете использовать KeyListener
для этой цели, объединив некоторые вещи. Посмотрите на следующий пример, который должен быть помещен в переопределенный метод keyPressed(KeyEvent e)
.
if (e.isControlDown() && e.getKeyChar() != 'a' && e.getKeyCode() == 65) {
System.out.println("Select All");
}
Строка Select All
будет отображаться при нажатии Ctrl + a. Метод e.isControlDown()
проверяет, нажата ли клавиша Ctrl или нет.
Аналогично, комбинация клавиш Alt может быть выполнена с использованием того же метода с помощью метода e.isAltDown()
.
Логика этого: e.getKeyChar()
возвращает символ нажатия клавиш, а e.getKeyCode()
возвращает свой код ASCII. Когда Ctrl нажата и удерживается, e.getKeyChar()
не вернется a
, а e.getKeyCode()
будет тем же самым 65
. Надеюсь, вы это поняли. Не стесняйтесь спрашивать больше.
Ответ 3
ALT + 1 + 0 (или "ALT + 10", как это может быть описано в файле справки или аналогичном)
похоже, сталкивается с (из одного из ваших комментариев):
Так, например, если пользователь хочет изменить данные в столбце 11 (который будет называться "10" ), он/она нажимает ALT + 1 + [отпускает как ALT, так и 1] 0.
Предполагая, что ALT + 10 означает "Нажатие ALT, нажатие и отпускание 1, нажатие и отпускание 0, высвобождение ALT" Я предлагаю попробовать следующее:
В keyPressed, прослушивая клавишу ALT, активируйте логический флаг, isAltPressed и создайте буфер для удерживания нажатий клавиш (строка, скажем).
В keyTyped, если isAltPressed активен, добавьте коды ключей в буфер.
В keyReleased, снова прослушивая ALT, откройте условный запрос буфера и выполнение действий.
public void keyPressed (KeyEvent e){
if (e.getKeyCode() == KeyEvent.VK_ALT){
buffer = ""; //declared globally
isAltPressed = true; } //declared globally
}
public void keyTyped (KeyEvent e){
if (isAltPressed)
buffer.append (e.getKeyChar());
}
public void keyReleased (KeyEvent e){
if (e.getKeyCode() == KeyEvent.VK_ALT){
isAltPressed = false;
if (buffer.equals (4948)) //for pressing "1" and then "0"
doAction();
else if (buffer.equals(...))
doOtherAction();
...
}//if alt
}
Ответ 4
import java.awt.*;
import java.awt.event.*;
class KDemo
{
public static void main(String args[])
{
Frame f = new Frame();
f.setSize(500,500);
f.setVisible(true);
f.addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
AWTKeyStroke ak = AWTKeyStroke.getAWTKeyStrokeForEvent(e);
if(ak.equals(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK)))
{
System.exit(0);
}
}
});
}
}
Ответ 5
Я бы предположил, что вместо использования комбинаций клавиш рассмотрим некоторое поле ввода при окне isVisible()
и сфокусировано. Поле может быть скрыто, например, Windows 'File explorer, скрытый поиск имени файла (введите каталог, введите имя файла и соответствие сфокусирован) или будет видимым, как в Ubuntu.
Комбинации клавиш не предназначены для включения более чем одного ключа, кроме модификаторов, хотя вы можете достичь этого.
Ответ 6
Я думаю, что есть более простой способ, которым я пользуюсь. Если KeyEvent является ev, тогда, если вы исследуете:
(int)ev.getKeyChar()
вы обнаружите, что ctrl - a равно 1, ctrl - b равно 2 и так далее. Я хотел использовать ctrl - s для сохранения. Поэтому я просто использую:
(((int)ev.getKeyChar())==19)
чтобы обнаружить это. Не знаю, почему, но он работает нормально, тогда как:
ev.isControlDown() && ev.getKeyChar()=='s'
нет.