Как назначить ярлык (Alt+‹key›) для кнопки SWT с изображением?

Я разрабатываю приложение RCP, где мне нужно назначить ярлык (Alt+[клавиша]) для кнопки SWT с изображением. Я могу назначить ярлык для кнопки с текстом, используя символ «&», лиса, например: button.setText("&Select All"); тогда Alt+S будет действовать как ярлык для этой кнопки.

У меня есть 2 вопроса по этому поводу:

  1. Как назначить сочетание клавиш Alt + [клавиша] для кнопки SWT с изображениями (без текста) без использования прослушивателя клавиш?

  2. Как назначить сочетание клавиш Alt+[key] для кнопки SWT с текстом, но без буквы сочетания клавиш в этом тексте, опять же без использования прослушивателя клавиш. например: «UnFix» — это текст на кнопке, а сочетание клавиш должно быть Alt+Q.

Я надеюсь, что должен быть способ сделать это в SWT.


person Pooja    schedule 24.02.2015    source источник
comment
Вы говорите RCP, но затем спрашиваете об SWT. В плагинах Eclipse есть код для этого, но его нет в SWT. Так это просто SWT или Eclipse RCP с плагинами?   -  person greg-449    schedule 24.02.2015
comment
Грег, его RCP-приложение Eclipse с плагинами, но я использовал компоненты SWT для разработки своего пользовательского интерфейса.   -  person Pooja    schedule 24.02.2015
comment
Для плагинов вы обычно используете команду, обработчик и привязку клавиш для настройки ярлыков.   -  person greg-449    schedule 24.02.2015


Ответы (2)


Вы можете выбрать мнемонику, поместив амперсанд перед буквой, которая должна служить мнемонической буквой (например, "&Select All").

Если элемент управления не имеет текста или нужная буква не встречается в этом тексте, вам необходимо использовать прослушиватель ключевых событий. Обойти это невозможно.

Некоторые приложения работают с «отсутствующей буквой», помещая мнемоническую букву в скобки следующим образом: "UnFix (&Q)". Хотя технически это работает, я нахожу это эстетически довольно неудачным выбором.

Использование неочевидной мнемонической буквы также имеет проблемы с удобством использования: как пользователь может узнать или запомнить, что Alt+Q означает «UnFix»?

person Rüdiger Herrmann    schedule 24.02.2015
comment
Я согласен с вами по поводу проблемы с удобством использования, с которой пользователь может столкнуться из-за неочевидной мнемоники, поэтому я также дал всплывающие подсказки для кнопок для отображения ярлыка. Я просто хотел подтвердить другой способ назначения ярлыков кнопкам с изображениями, и ваш ответ разрешил это, спасибо за ответ. - person Pooja; 24.02.2015
comment
Я назначил ярлык кнопкам, используя & при настройке текста, но я не могу вызвать действие, написанное для этой кнопки, при нажатии ярлыка. Если мне также нужно использовать прослушиватель keyEvent для этой цели, то какой смысл использовать &? - person Pooja; 03.03.2015
comment
Возможно, мнемоники поддерживаются не на всех платформах. Какую ОС или оконную систему вы используете? - person Rüdiger Herrmann; 03.03.2015
comment
Я использую Windows 7, 32-битная ОС. Прямо сейчас я добавил selectionListner на кнопку для вызова определенного действия. Теперь нажатие клавиши Alt+‹› вызывает действие, записанное в selectionListner... - person Pooja; 03.03.2015

Перепробовав множество обходных путей, я, наконец, могу назначить сочетание клавиш для кнопки SWT с изображением.

SWT Button.class использует метод getText() для поиска мнемоники, поэтому переопределение метода getText() в Button.class и восстановление мнемонического ключа будет служить цели. Метод checkSubclass() также должен быть переопределен, чтобы ничего не делать, иначе возникнет ошибка swt Подклассы не разрешены.

Button newButton = new Button(parent, SWT.PUSH){
        @Override
        public String getText() {
            return "&N";
        }

        @Override
        protected void checkSubclass() {
            // Do Nothing to avoid Subclassing Not Allowed error.
        }
    };
    newButton.setImage(newButtonImage);

В приведенном выше примере newButton имеет сочетание клавиш Alt+N.

person Pooja    schedule 03.03.2015
comment
Чрезвычайно хитрый и умный. Не уверен, что я бы рекомендовал этот подход из-за того, что он обходит API! - person J. Dimeo; 02.08.2018