【问题标题】:Mnemonics (underlined letters) on popup menus in Java Swing on Windows XPWindows XP 上 Java Swing 中弹出菜单上的助记符(带下划线的字母)
【发布时间】:2012-04-30 00:07:12
【问题描述】:

在 Windows XP 上运行的 Java Swing 应用程序的上下文菜单中,我无法在上下文菜单上一致地显示下划线。

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

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

我可以让下划线显示的唯一方法是在右键单击鼠标时按住 Alt。这有点没用,因为如果有人已经将手放在鼠标上进行右键单击,他们将不想使用键盘在弹出窗口中选择某些内容。

当从菜单键调用上下文菜单时,是否可以在 Swing 中显示下划线?不编写我自己的 Look & Feel 库?

【问题讨论】:

    标签: swing contextmenu popupmenu jpopupmenu


    【解决方案1】:

    好问题。我刚刚在 OS X 上试过这个,我也没有得到带下划线的字母。就像你一样,我通过点击 alt 按钮来获取它们(不是在单击期间,而是在显示我的弹出菜单时)。

    但是,在 OS X 上,我不记得任何包含下划线字母的弹出窗口。我刚刚检查了一些默认应用程序,它们都没有带有下划线项目的弹出菜单。快速谷歌搜索indicated this as well。所以在这种情况下,外观与操作系统是一致的。

    经过一番谷歌搜索后,我找到了following topic,它表明在 Windows 中默认有一个隐藏助记符的选项,并且仅在您按 alt 时显示它们(如果您需要按任何方式使用助记符,则我从我的 Windows 时代记得正确)。您可能想尝试一下。

    总之,这是一个 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 );
          }
        } );
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-21
      相关资源
      最近更新 更多