Java: как создать вставку MenuItem с ускорителем?

Когда я создаю JMenuBar с действием Paste в нем и назначаю ему ускоритель (Control - V), я пишу действие вставки для JMenuItem. И я использую ускоритель, мой код будет выполнен, и будет выполнено предварительно запрограммированное Swing действие Paste, поэтому я думаю, что текст будет вставлен дважды.

Я не проверял это, но выглядит очень логично, что это будет проблема.

Спасибо


person Martijn Courteaux    schedule 09.11.2010    source источник
comment
может быть, вам нужно удалить действие «Вставить» из карты действий ваших компонентов?   -  person Denis Tulskiy    schedule 09.11.2010


Ответы (1)


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

У вас может быть вызвано другое действие в зависимости от того, какой компонент имеет фокус и как было вызвано действие.

Например, если фокус находится на текстовом компоненте, то я предполагаю, что будет использоваться действие «Вставить» по умолчанию.

Если вы щелкнете по пункту меню, будет вызвано действие, которое вы добавили к пункту меню.

Если вы вызываете Control + V, когда фокус находится не в текстовом поле, то я предполагаю, что действие, связанное с пунктом меню, будет вызвано, потому что ускорители используют «окно в фокусе» (или как оно называется) InputMap.

Если вы используете действия по умолчанию, предоставляемые EditorKit, у вас не возникнет проблем:

JMenuItem pasteAction = new JMenuItem( new DefaultEditorKit.PasteAction() );
pastAction.setAccelerator(...);
person camickr    schedule 09.11.2010