Как KeyListener может обнаружить комбинации клавиш (например, ALT + 1 + 1) - PullRequest
19 голосов
/ 21 октября 2011

Как я могу позволить своему обычному KeyListener прослушивать комбинации ALT (или CTRL в этом отношении) + более одной другой клавиши?

Предположим, у меня есть 11 различных действий, которые я хочуприложение, чтобы сделать, в зависимости от комбинации нажатых клавиш.ALT + 0 - ALT + 9, очевидно, не представляет никаких проблем, в то время как для ALT + 1 + 0 (или «ALT + 10», как это может быть описано в файле справки или аналогичном), я не могу найти хорошего решения в Интернете (или в моей голове).Я не уверен, что это решение с таймером является единственным возможным способом.

Заранее спасибо за любые предложения!

Редактировать: Действия 0-9 + действие 10 = 11 действий.Спасибо @ X-Zero.

Ответы [ 6 ]

27 голосов
/ 21 октября 2011

Вы не должны использовать 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.Эти модификаторы могут объединяться или объединяться для представления различных комбинаций клавиш.Например,

KeyStroke.getKeyStroke(KeyEvent.VK_SPACE,
                       java.awt.event.InputEvent.CTRL_DOWN_MASK
                       | java.awt.event.InputEvent.SHIFT_DOWN_MASK)

Для представления, когда были нажаты клавиши Ctrl + Shift.

Редактировать: Как уже отмечалось, это не отвечает на ваш вопрос, но вместоэто просто хороший совет.

19 голосов
/ 18 сентября 2012

Вы можете использовать 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. Надеюсь, вы понимаете это. Не стесняйтесь спрашивать больше.

2 голосов
/ 14 января 2013

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
    }
0 голосов
/ 10 марта 2018

Я думаю, что есть более простой способ, которым я пользуюсь.Если KeyEvent равен ev, то если вы исследуете:

(int)ev.getKeyChar()

, вы обнаружите, что ctrl - a равно 1, ctrl - b равно 2 и так далее.Я хотел использовать ctrl - s для сохранения.Поэтому я просто использую:

(((int)ev.getKeyChar())==19)

, чтобы обнаружить его.Понятия не имею почему, но работает нормально, тогда как:

ev.isControlDown() && ev.getKeyChar()=='s'

нет.

0 голосов
/ 19 апреля 2017

Я бы предложил вместо использования комбинаций клавиш рассмотреть некоторое поле ввода, когда окно isVisible() сфокусировано.Поле может быть скрыто, как Windows File Explorer, поиск скрытого имени файла (введите каталог, введите имя файла и переписка будет сфокусировано), или будет видимым, как в Ubuntu.

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

0 голосов
/ 07 ноября 2015
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);
                   }
               }
           });
        }
   }
...