遵循UI标准: 如果应用程序菜单项(在顶部菜单栏上)打开一个下拉列表,它必须按照下面的显示进行修饰: 第一个字母有"文字装饰:下划线"属性。 但是要遵守这个http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html 我在javafx应用程序中无法做到这一点。
有什么建议吗?
答案 0 :(得分:25)
助记符背景
您在图片中指出的是keyboard mnemonic。 JavaFX确实支持助记符,但您只能在本机使用助记符的平台上以及编程应用程序以使用助记符的平台上看到它们。例如,Windows程序通常使用助记符,因此当您在Windows上运行应用程序时,您将看到JavaFX应用程序中的助记符,但OS X程序通常不使用助记符,因此如果您在OS X上运行JavaFX应用程序,您可能看不到显示助记符。
另请注意,在Windows上,即使您已按上述方法定义了助记符,也需要按 ALT 键以查看JavaFX应用程序中带下划线的助记符(这是标准的Windows应用程序的方式)就像Notepad一样,所以JavaFX在这方面也没有什么不同。)
定义您的助记符
在菜单项上将mnemonic parsing设置为true。 (默认情况下,菜单项实际上是正确的,但阅读链接的文档以更好地理解它)。
在菜单项文本中,在您希望用作菜单项的键盘助记符的字母前面放置一个下划线字符_
。
任何Labeled(每个带文本的控件)都可以显示并响应助记符,只要您为标记项设置助记解析为true并在标签文本中放置下划线。
还定义加速器
在为OS X编写应用程序时,Apple's developer guidelines鼓励使用加速器而不是助记符。因此,为了让您的应用程序更好地跨平台工作,我建议为您的菜单项提供加速器,即使您已经拥有在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")
来指定加速器快捷方式。这是一种在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<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);
}
}