Я разрабатываю приложение 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 или я что-то пропустил?
Торстен.




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);, который заставит все пункты меню инициализироваться.
Конечно, вы должны вызывать вышеуказанные методы после того, как создали пункты меню.