Windows XP上Java Swing中弹出菜单上的助记符(带下划线的字母)

Windows XP上Java Swing中弹出菜单上的助记符(带下划线的字母),swing,contextmenu,popupmenu,jpopupmenu,Swing,Contextmenu,Popupmenu,Jpopupmenu,在WindowsXP上运行的JavaSwing应用程序中,要使上下文菜单上的助记符一致地显示下划线有些困难 如果我右键单击鼠标,下划线不会显示在弹出菜单上-这很好,因为这种行为与其他Windows应用程序一致 但是,如果使用菜单键(通常位于右Windows键旁边)打开弹出菜单,则下划线不会显示在我的Swing应用程序中,而会显示在标准Windows应用程序(如写字板、资源管理器和控制面板)中 我能显示下划线的唯一方法是在按住Alt键的同时右键单击鼠标。这有点没用,因为如果有人已经用鼠标右键点击了

在WindowsXP上运行的JavaSwing应用程序中,要使上下文菜单上的助记符一致地显示下划线有些困难

如果我右键单击鼠标,下划线不会显示在弹出菜单上-这很好,因为这种行为与其他Windows应用程序一致

但是,如果使用菜单键(通常位于右Windows键旁边)打开弹出菜单,则下划线不会显示在我的Swing应用程序中,而会显示在标准Windows应用程序(如写字板、资源管理器和控制面板)中

我能显示下划线的唯一方法是在按住Alt键的同时右键单击鼠标。这有点没用,因为如果有人已经用鼠标右键点击了,他们就不想用键盘在弹出窗口中选择什么


当从菜单键调用上下文菜单时,是否可以使下划线以Swing方式显示?没有写我自己的外观库?

好问题。我只是在OSX上试过这个,我也没有得到带下划线的字母。就像你一样,我不是在单击时按alt按钮,而是在弹出菜单显示时按

然而,在OSX上,我记不起任何包含下划线字母的弹出窗口。我只是检查了一些默认应用程序,没有一个有带下划线的弹出菜单。快速的谷歌搜索。因此,在这种情况下,外观和感觉与操作系统是一致的

在更多的谷歌搜索之后,我发现了一个选项,它表明在Windows中有一个默认隐藏助记符的选项,并且只有当你按下alt键时才显示助记符,如果我在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 );
      }
    } );
  }
}