JavaFX 菜单 - 第一个字母,下划线装饰

2022-09-03 09:49:34

遵循 UI 标准:如果应用程序菜单项(位于顶部菜单栏上)打开一个下拉列表,则必须对其进行装饰,因为它显示在:Decorated menu item first letter第一个字母具有“text-decoration:下划线”属性。但是考虑到这一 http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html 我不能在javafx应用程序中这样做。

有什么建议吗?


答案 1

助记符的背景

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

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

定义助记符

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

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

还要定义加速器

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

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

第一个字母具有“文本修饰:下划线”属性。

这无关紧要,在 JavaFX 应用程序中也不起作用。JavaFX 支持与 HTML 开发中使用的 w3c CSS 属性不同的 CSS 属性。特别是,JavaFX不支持:文本修饰:下划线。JavaFX 仅支持 JavaFX CSS 参考指南中定义的 CSS 属性。特别是 JavaFX 文本支持 -fx-下划线来指定文本应应用下划线样式。但即便如此,还是会给标签中的所有文本加下划线,而不是特定的字母,这不是你想要的。fx-underline

示例应用程序

演示如何在 JavaFX 应用程序中的菜单上使用快捷键和助记符。请注意,在示例中,它如何用于指定加速器快捷方式。这是在 JavaFX 中指定标准操作系统快捷键的一种独立于操作系统的方式。在 Windows 中,SHORTCUT 将映射到 。在OS X中,SHORTCUT将映射到OS X键。KeyCombination.keyCombination("SHORTCUT+N")CTRLCOMMAND

屏幕截图演示了如何在 Windows 7 上运行应用程序并按键以显示助记符。ALT

New file sample

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);
    }
}

答案 2

推荐