Мнемоника (подчеркнутые буквы) во всплывающих меню в Java Swing в Windows XP

У меня возникли некоторые проблемы с отображением подчеркиваний для отображения мнемоники в контекстных меню в приложении Java Swing, работающем в Windows XP.

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

Но если вызвать всплывающее меню с помощью клавиши меню (обычно рядом с правой клавишей Windows), подчеркивания не отображаются для моего приложения Swing, тогда как они отображаются для стандартных приложений Windows, таких как Wordpad, Explorer и Панель управления.

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

Можно ли получить подчеркивание для отображения в Swing, когда контекстное меню вызывается из клавиши меню? Не написав свою собственную библиотеку Look & Feel?

1 ответ

Хороший вопрос. Я только что попробовал это на OS X, и я не получаю подчеркнутые буквы также. Как и вы, я получаю их, нажимая кнопку alt (не во время щелчка, а когда отображается мое всплывающее меню).

Тем не менее, на OS X I не могу вспомнить ни одно всплывающее окно, которое содержит подчеркнутые буквы. Я только что проверил некоторые приложения по умолчанию, и ни у одного из них нет всплывающего меню с подчеркнутыми элементами. Быстрый поиск в Google также показал это. Так что в этом случае внешний вид соответствует ОС.

После еще одного приближения к поиску я обнаружил следующую тему, в которой предполагается, что в Windows есть возможность скрыть мнемонику по умолчанию и показывать ее только при нажатии клавиши alt (которую нужно нажать в любом случае, чтобы использовать мнемонику, если я правильно помню из мои окна дней). Вы можете попробовать это.

Во всяком случае, вот SSCCE, позволяющий пользователям Windows быстро проверить это:

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPopupMenu;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

public class MnemonicTest {
  public static JFrame createUI(){
    JFrame testFrame = new JFrame(  );

    testFrame.add( createLabelWithPopupMenu() );

    testFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    testFrame.pack();
    return testFrame;
  }

  private static JLabel createLabelWithPopupMenu(){
    JLabel result = new JLabel( "Right-click me" );
    result.setComponentPopupMenu( createPopupMenu() );
    return result;
  }



  private static JPopupMenu createPopupMenu(){
    JPopupMenu popupMenu = new JPopupMenu(  );
    popupMenu.add( createAction() );
    return popupMenu;
  }

  private static Action createAction(){
    AbstractAction result = new AbstractAction() {
      @Override
      public void actionPerformed( ActionEvent e ) {
        System.out.println( "MnemonicTest.actionPerformed" );
      }
    };
    result.putValue( Action.MNEMONIC_KEY, KeyEvent.VK_A );
    result.putValue( Action.NAME, "Action" );
    return result;
  }

  public static void main( String[] args ) {
    EventQueue.invokeLater( new Runnable() {
      @Override
      public void run() {
        createUI().setVisible( true );
      }
    } );
  }
}
Другие вопросы по тегам