Клавиша ускорения пункта меню работает только после того, как пункт меню был показан

Я разрабатываю приложение SWT / JFace с использованием библиотек из Eclipse 3.4.1. Я столкнулся со следующей проблемой в Windows (Vista 32bit) и Ubuntu 8.10 32bit:

Я создаю строку меню в методе createMenuManager JFace ApplicationWindow. Я добавляю MenuManager для файлов, редактирования и помощи.

Затем я добавляю ExitAction в файл MenuManager следующим образом:

filemenu.add(new ExitAction(this));

ExitAction определяется следующим образом:

public class ExitAction extends Action {
  final ApplicationWindow window;

  public ExitAction(ApplicationWindow w) {

    this.window = w;
    setText("E&xit");
    setToolTipText("Exit the application");
    setAccelerator(SWT.MOD1 + 'Q');    
  }
}

Теперь, когда мое приложение запускается, я хочу иметь возможность нажать «CTRL + Q», чтобы выйти из приложения. Однако это не работает. Только ПОСЛЕ того, как я нажму «Файл» в строке меню и ЗАТЕМ нажав «CTRL + Q», приложение закроется.

Я пробовал это с разными ускорителями - такое же поведение.

Однако это сработает, если я создам «MenuItem» вместо «Action», чтобы внести вклад в строку меню.

Это ошибка SWT или я что-то пропустил?

Торстен.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
830
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

AFAIK setAccelerator(.) не делает ничего, кроме добавления соответствующего текста в ваш MenuItem. Вы обязаны зарегистрироваться для участия в мероприятии KeyUp и отреагировать на него.

Вы можете использовать Display.addFilter(SWT.KeyUp, myListener) для регистрации вашего Listener независимо от ваших виджетов.

Оказывается, это ошибка в Eclipse 3.4. Я отправил отчет об ошибке: https://bugs.eclipse.org/bugs/show_bug.cgi?id=253078

Ответ принят как подходящий

Обновление: у меня есть повторяющаяся ошибка, которая также содержит обходной путь. URL-адрес ошибки: https://bugs.eclipse.org/bugs/show_bug.cgi?id=243758

В основном обходной путь - вызвать create() на ApplicationWindow, а затем getMenuBarManager().updateAll(true);, который заставит все пункты меню инициализироваться.

Конечно, вы должны вызывать вышеуказанные методы после того, как создали пункты меню.

Другие вопросы по теме