【问题标题】:JavaFX Menu - first letter, underline decorationJavaFX 菜单 - 第一个字母,下划线装饰
【发布时间】:2014-08-21 09:04:18
【问题描述】:

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

有什么建议吗?

【问题讨论】:

  • 我认为这只是在激活了相应的加速器(即 Windows 上的 ALT 键)后才发生
  • 我对这种装饰的原因可能是错误的,但我希望它被“加下划线”)

标签: java javafx standards


【解决方案1】:

助记符背景

您在图片中指向的是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);
    }
}

【讨论】:

  • +1,我只是补充一下,我使用多语言支持,在我的语言文件中,我也使用下划线来设置下划线。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2017-03-10
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2015-01-28
相关资源
最近更新 更多