助记符背景
您在图片中指向的是keyboard mnemonic。 JavaFX 确实支持助记符,但您只会在本机使用助记符的平台上看到它们,并且您已将应用程序编程为使用助记符。例如,Windows 程序通常使用助记符,因此当您在 Windows 上运行应用程序时,您会在 JavaFX 应用程序中看到助记符,但 OS X 程序通常不使用助记符,因此如果您在 OS X 上运行 JavaFX 应用程序,您可能看不到助记符显示。
另外请注意,在 Windows 上,即使您已按上述方式定义了助记符,您也需要按 ALT 键才能在 JavaFX 应用程序中看到带下划线的助记符(这是标准的 Windows 应用程序像记事本一样工作,所以 JavaFX 在这方面没有什么不同)。
定义你的助记符
在菜单项上将 mnemonic parsing 设置为 true。 (默认情况下菜单项实际上是这样,但请阅读链接文档以更好地理解它)。
在您的菜单项文本中,将下划线字符 _ 放在您想用作菜单项键盘助记符的字母前面。
只要您将标记项的助记符解析设置为 true 并在标签文本中放置下划线,任何 Labeled(即每个带有文本的控件)都可能显示并响应助记符。
同时定义加速器
Apple's developer guidelines 鼓励在为 OS X 编写应用程序时使用加速器而不是助记符。因此,为了让您的应用程序更好地跨平台工作,我建议为您的菜单项提供加速器,即使您已经有助记符在 Windows 下使用。你可以在 JavaFX 中setAccelerators on menu items。有关在 JavaFX 应用程序中使用加速器的更多信息,请参阅Using JavaFX 2.2 Mnemonic (and accelerators) 的答案(它实际上演示了加速器的使用而不是助记符的使用......)。
使用 JavaFX CSS 属性,而不是 w3c CSS 属性
第一个字母有“text-decoration:underline”属性。
这无关紧要,在 JavaFX 应用程序中不起作用。 JavaFX 支持与 HTML 开发中使用的 w3c CSS 属性不同的 CSS 属性。特别是,JavaFX 不支持:text-decoration:underline。 JavaFX 仅支持 JavaFX CSS reference guide 中定义的 CSS 属性。特别是 JavaFX Text 支持 -fx-underline 来指定文本应该应用下划线样式。但即便如此,fx-underline 仍会为标签中的所有文本而不是特定字母添加下划线,这不是您想要的。
示例应用程序
演示如何在 JavaFX 应用程序的菜单上使用加速器和助记符。请注意,在示例中,它使用KeyCombination.keyCombination("SHORTCUT+N") 来指定加速键快捷方式。这是在 JavaFX 中指定标准操作系统快捷键的一种独立于操作系统的方式。在 Windows 中,SHORTCUT 将映射到 CTRL。在 OS X 中,SHORTCUT 将映射到 OS X COMMAND 键。
屏幕截图演示了在 Windows 7 上运行应用程序并按下 ALT 键以显示助记符。
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.input.KeyCombination;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class MnemonicAcceleratedMenu extends Application {
@Override
public void start(Stage stage) {
Menu fileMenu = new Menu("_File");
MenuItem newFileMenuItem = new MenuItem("_New...");
newFileMenuItem.setAccelerator(
KeyCombination.keyCombination("SHORTCUT+N")
);
newFileMenuItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Something new, this way comes");
}
});
fileMenu.getItems().add(
newFileMenuItem
);
MenuBar menuBar = new MenuBar();
menuBar.getMenus().setAll(
fileMenu
);
VBox layout = new VBox(menuBar);
layout.setPrefSize(200, 100);
stage.setScene(new Scene(layout));
stage.show();
}
public static void main(String[] args) {
launch(args);
}
}