JavaFX菜单 – 首字母,下划线装饰

遵循UI标准:如果应用程序菜单项(在顶部菜单栏上)打开一个下拉列表,它必须按照下面的显示进行装饰: 装饰菜单项首字母 第一个字母有“text-decoration:underline”属性。 但是根据这个http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html我不能在javafx app中做到这一点。

有什么建议么?

关于助记符的背景

您在图像中指出的是键盘助记符 。 JavaFX确实支持助记符,但您只能在本机使用助记符的平台上以及编程应用程序以使用助记符的平台上看到它们。 例如,Windows程序通常使用助记符,因此当您在Windows上运行应用程序时,您将看到JavaFX应用程序中的助记符,但OS X程序通常不使用助记符,因此如果您在OS X上运行JavaFX应用程序,您可能看不到显示助记符。

还要注意,在Windows上,即使您已经如上所述定义了助记符,也需要按ALT键以查看JavaFX应用程序中带下划线的助记符(这就是Notepad等标准Windows应用程序的工作方式,因此JavaFX不是在这方面不同)。

定义你的助记符

在菜单项上将助记符解析设置为true。 (默认情况下,菜单项实际上是正确的,但阅读链接的文档以更好地理解它)。 在菜单项文本中,在要用作菜单项的键盘助记符的字母前面放置一个下划线字符_

只要您为标签项设置助记解析为true并在标签文本中放置下划线,任何Labeled (每个控件都带有文本)都可能显示并响应助记符。

还定义加速器

在为OS X编写应用程序时, Apple的开发人员指南鼓励使用加速器而不是助记符。因此,为了让您的应用程序更好地跨平台工作,我建议为您的菜单项提供加速器,即使您已经在Windows下使用助记符。 您可以在JavaFX中的菜单项上设置加速器。 有关在JavaFX应用程序中使用加速器的更多信息,请参阅使用JavaFX 2.2助记符(和加速器) (实际上演示加速器使用而不是助记符使用……)的答案。

使用JavaFX CSS属性,而不是w3c CSS属性

第一个字母有“text-decoration:underline”属性。

这是无关紧要的,不适用于JavaFX应用程序。 JavaFX支持与HTML开发中使用的w3c CSS属性不同的CSS属性。 特别是,JavaFX不支持: text-decoration:underline 。 JavaFX仅支持JavaFX CSS参考指南中定义的CSS属性。 特别是JavaFX Text支持-fx-underline来指定文本应该应用下划线样式。 但即使这样, fx-underline也会强调标签中的所有文字而不是特定的字母,这不是你想要的。

样品申请

演示在JavaFX应用程序中的菜单上使用加速器和助记符。 请注意,在示例中,它使用KeyCombination.keyCombination("SHORTCUT+N")来指定加速器快捷方式。 这是一种在OSFX中指定标准OS快捷键的独立于操作系统的方法。 在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() { @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); } }