3

在 Windows XP 上运行的 Java Swing 应用程序中,在上下文菜单上始终显示助记符时,我遇到了一些麻烦。

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

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

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

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

4

1 回答 1

0

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

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

经过一番谷歌搜索后,我发现以下主题表明,在 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 );
      }
    } );
  }
}
于 2012-04-30T08:02:54.427 回答