Можно ли определить несколько ускорителей для JMenuItem? - PullRequest
8 голосов
/ 22 декабря 2009

У меня проблема с setAccelerator(). Прямо сейчас у меня есть код, который работает для Ctrl + X для операции удаления. Я хочу установить акселератор в Shift + Delete, а также для того же JMenuItem.

Мой код выглядит следующим образом:

JMenuItem item = new JMenuItem(menuText);
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_X, KeyEvent.CTRL_MASK));
item.setAccelerator(KeyStroke.getKeyStroke(
    KeyEvent.VK_DELETE, KeyEvent.SHIFT_MASK));

, но это работает только для операции Shift + Delete. Кажется, это переопределяет операцию Ctrl + X. Можем ли мы заставить оба этих нажатия клавиш работать одновременно?

Пожалуйста, руководство.

Ответы [ 3 ]

7 голосов
/ 22 декабря 2009

Да, это может быть сделано. За кулисами setAccelerator () просто создает привязку клавиш, однако, как вы заметили, вторая привязка заменяет первую.

Итак, вам нужно создать Action (не ActionListener), чтобы добавить пункт меню. Прочитайте раздел из учебника по Swing на Как использовать действия для получения дополнительной информации. Теперь, когда вы создали действие, вы можете поделиться действием с другим KeyStroke, вручную создав привязку клавиш. Вы можете прочитать раздел из учебника по Swing на Как использовать привязки клавиш для подробного объяснения. Или вы можете прочитать мой блог на Key Bindings , где приведены несколько простых примеров кода.

Эта вторая привязка не будет отображаться в самом пункте меню.

3 голосов
/ 22 декабря 2009

От: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/AWTEvent.html

Маски также используются для указания того, какие типы событий должен прослушивать AWTEventListener.

Таким образом, вы можете комбинировать маску для двух ключей, но не для KeyEvents.

item.setAccelerator( 
    KeyStroke.getKeyStroke(
       KeyEvent.VK_X, KeyEvent.CTRL_MASK + KeyEvent.SHIFT_MASK));

Обходным решением было бы поймать KeyEvent посередине (после того, как ваш компонент запустил его, но до того, как ваши слушатели сработают с ним) и проверить, является ли его одной из двух комбинаций. Затем запустите одно событие, на котором вы программно соглашаетесь представлять действие, которое вы хотели.

0 голосов
/ 22 декабря 2009

Второй вызов действительно переопределяет ускоритель. Если метод начинается с set, будет только один. Если метод начинается с add, у вас может быть более одного (например, для нескольких слушателей).

Если вы хотите, чтобы несколько нажатий клавиш делали одно и то же, я думаю, что вы должны добавить keyListener в верхний фрейм (или панель, диалоговое окно, ...), который вызывает слушатели действий, добавленные в menuItem.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...