Подтвердить что ты не робот

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

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

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

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

Изменить: Действия 0-9 + действие 10 = 11 действий. Спасибо @X-Zero.

4b9b3361

Ответ 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'

нет.