Как KeyListener может обнаружить комбинации клавиш (например, ALT + 1 + 1)

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

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

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

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

6 ответов


вы не должны использовать KeyListener для этого типа взаимодействия. Вместо этого используйте привязки клавиш, о которых вы можете прочитать в Java Учебник. Тогда вы можете использовать InputEvent маска представлять, когда различные вспомогательные клавиши depresed. Например:

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

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

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

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


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


ALT + 1 + 0 (или" ALT+10", как это может быть описано в файле справки или аналогичном)

Кажется, столкновение с (из одного из ваших комментариев):

Так, например, если пользователь хочет изменить данные в столбце 11 (который будет называться "10"), S/он нажмет ALT + 1 + [отпустит ALT и 1] 0.

предполагая, что ALT+10 означает "нажатие ALT, нажатие и освобождение 1, нажатие и освобождение 0, освобождение ALT", я предлагаю попробовать это:

в нажатой клавише, прослушивая клавишу 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
    }

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

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

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


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

(int)ev.getKeyChar()

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

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

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

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

нет.