使用 JavaFX 2.2 助记符(和加速器)

2023-11-30

我正在尝试让 JavaFX 助记符发挥作用。我在场景中有一些按钮,我想要实现的是通过按 Ctrl+S 来触发此按钮事件。 这是一个代码骨架:

@FXML
public Button btnFirst;

btnFirst.getScene().addMnemonic(new Mnemonic(btnFirst, 
            new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN)));

Button 的助记词解析为 false。 (好吧,在尝试使其工作时,我尝试将其设置为 true,但没有结果)。 JavaFX 文档指出,当在场景上注册助记符,并且 KeyCombination 到达场景但未使用时,目标节点将被发送一个 ActionEvent。但这不起作用,可能是我做错了......

我可以使用标准按钮的助记符(通过将 mnemonicParsing 设置为 true 并在“F”字母前添加下划线字符)。但是这种方式用户必须使用 Alt 键,这会在带有菜单栏的浏览器上带来一些奇怪的行为(如果应用程序嵌入到网页中,则在按 Alt+S 触发按钮事件后会激活浏览器的菜单)。 另外,标准方式无法创建Ctrl+Shift+F3等快捷键。

那么,是否有某种方法可以实现这一点呢?


对于您的用例,我认为您实际上想使用加速器而不是助记符。

button.getScene().getAccelerators().put(
  new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN), 
  new Runnable() {
    @Override public void run() {
      button.fire();
    }
  }
);

在大多数情况下,建议您使用 KeyCombination.SHORTCUT_DOWN 作为修饰符说明符,如上面的代码所示。对此的一个很好的解释是组合键文档:

快捷键修饰符用于表示修饰键,即 常用于主机平台上的键盘快捷键。这是为了 Windows 上的示例控件和 Mac 上的元(命令键)。通过使用 快捷键修饰符开发者可以创建平台无关的 快捷方式。所以“快捷键+C”组合键是在内部处理的 在 Windows 上为“Ctrl+C”,在 Mac 上为“Meta+C”。

如果您想专门编写代码来仅处理 Ctrl+S 组合键,您可以使用:

new KeyCodeCombination(KeyCode.S, KeyCombination.CONTROL_DOWN)

这是一个可执行的示例:

import javafx.animation.*;
import javafx.application.Application;
import javafx.event.*;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.image.*;
import javafx.scene.input.*;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

public class SaveMe extends Application {
  @Override public void start(final Stage stage) throws Exception {
    final Label response = new Label();
    final ImageView imageView = new ImageView(
      new Image("http://icons.iconarchive.com/icons/gianni-polito/colobrush/128/software-emule-icon.png")
    );
    final Button button = new Button("Save Me", imageView);
    button.setStyle("-fx-base: burlywood;");
    button.setContentDisplay(ContentDisplay.TOP);
    displayFlashMessageOnAction(button, response, "You have been saved!");

    layoutScene(button, response, stage);
    stage.show();

    setSaveAccelerator(button);
  }

  // sets the save accelerator for a button to the Ctrl+S key combination.
  private void setSaveAccelerator(final Button button) {
    Scene scene = button.getScene();
    if (scene == null) {
      throw new IllegalArgumentException("setSaveAccelerator must be called when a button is attached to a scene");
    }

    scene.getAccelerators().put(
      new KeyCodeCombination(KeyCode.S, KeyCombination.SHORTCUT_DOWN), 
      new Runnable() {
        @Override public void run() {
          fireButton(button);
        }
      }
    );
  }

  // fires a button from code, providing visual feedback that the button is firing.
  private void fireButton(final Button button) {
    button.arm();
    PauseTransition pt = new PauseTransition(Duration.millis(300));
    pt.setOnFinished(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        button.fire();
        button.disarm();
      }
    });
    pt.play();
  }

  // displays a temporary message in a label when a button is pressed, 
  // and gradually fades the label away after the message has been displayed.
  private void displayFlashMessageOnAction(final Button button, final Label label, final String message) {
    final FadeTransition ft = new FadeTransition(Duration.seconds(3), label);
    ft.setInterpolator(Interpolator.EASE_BOTH);
    ft.setFromValue(1);
    ft.setToValue(0);
    button.setOnAction(new EventHandler<ActionEvent>() {
      @Override public void handle(ActionEvent event) {
        label.setText(message);
        label.setStyle("-fx-text-fill: forestgreen;");
        ft.playFromStart();
      }
    });
  }

  private void layoutScene(final Button button, final Label response, final Stage stage) {
    final VBox layout = new VBox(10);
    layout.setPrefWidth(300);
    layout.setAlignment(Pos.CENTER);
    layout.getChildren().addAll(button, response);
    layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 20; -fx-font-size: 20;");
    stage.setScene(new Scene(layout));
  }

  public static void main(String[] args) { launch(args); }
}
// icon license: (creative commons with attribution) http://creativecommons.org/licenses/by-nc-nd/3.0/
// icon artist attribution page: (eponas-deeway) http://eponas-deeway.deviantart.com/gallery/#/d1s7uih

示例输出:

Sample program output

2020 年 1 月更新,对多个控件使用相同的加速器

当前和以前的实现(JavaFX 13 及更早版本)中的加速器的一个警告是,您无法开箱即用地定义相同的加速键组合以在单个应用程序中的多个菜单或控件上使用。

欲了解更多信息,请参阅:

  • JavaFX ContextMenu 加速器从错误的选项卡触发
  • 以及相关的JDK-8088068 问题报告.

链接的问题报告包括一个解决方法,您可以使用它来允许您在应用程序的多个位置定义和使用相同的加速器(例如,在不同上下文菜单中的两个不同菜单项上)。

请注意,这仅适用于尝试在应用程序内的多个位置使用相同的加速器,如果您不需要尝试这样做,那么您可以忽略此信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 JavaFX 2.2 助记符(和加速器) 的相关文章

  • 多个按钮的一个 OnClick 处理程序

    我发现自己一直在做这样的事情 Button button1 Button findViewById R id button1 Button button2 Button findViewById R id button2 Button bu
  • JavaFX - 为什么多次将节点添加到窗格或不同的窗格会导致错误?

    我现在正在学习基本的 JavaFX 我不明白我正在阅读的书中的这一说法 不 诸如文本字段之类的节点只能添加到一个窗格中一次 将节点添加到多次窗格或不同的窗格将导致运行时错误 我可以从书中提供的UML图看出它是一个组合 但我不明白为什么 库类
  • Kivy - 单击按钮时编辑标签

    我希望 Button1 在单击时编辑标签 etykietka 但我不知道如何操作 你有什么想法吗 class Zastepstwa App def build self lista WebOps getList layout BoxLayo
  • 如何在PYQT中创建按钮点击

    我在 PyQT 中创建按钮单击时遇到了一些问题 当我创建如下按钮的点击时 这张图片无法保存 cv SetImageROI image pt1 0 pt1 1 pt2 0 pt1 0 int pt2 1 pt1 1 1 if self But
  • 在代码中旋转按钮(或其中的文本)

    我必须通过编码随机旋转按钮 或里面的文本 它是相同的 API级别低于11是否有button setRotate x 好吧 看了一下 答案是 很复杂 您可以使用旧的动画框架旋转按钮 例如像这样 Button button Button fin
  • 如何通过 HTML 按钮播放声音

    我目前通过网站播放音乐的方法是通过 HTML 音频标签 不过我希望能够通过 HTML 按钮来播放它 该按钮应该能够在播放和停止之间切换音乐 我在 JSFiddle 创建了一个示例 但不知道如何实现它 有人可以告诉我如何使用我的 JSFidd
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • TinyMCE 的 addButton() 函数中所有可能的设置属性是什么?

    The 文档 http www tinymce com wiki php API3 method tinymce Editor addButton对此还不是很清楚 name 字符串 要添加的按钮名称 设置 对象 带有标题 cmd 的设置对象
  • 如何从具有重复条目的过滤列表中删除特定索引?

    我有一个TableView由一个支持SortedList包裹一个FilteredList包裹一个ObservableList 过滤列表中的项目可以重复 也就是说 有可能是这样的情况list get 5 list get 10 用户可以选择行
  • 使用“切换”按钮切换日夜主题

    我已经实施了一个开关按钮在我的布局中并且想要使用 Android日夜主题使用按钮 dayNight 主题工作正常 但问题是 当我点击开关它不会立即起作用 我必须改变活动然后它就起作用了 例如如果我在一个活动中单击开关 它不会执行任何操作 直
  • javafx组合框下拉菜单从屏幕边缘跳出

    我有最新版本的 java 8 40 和 javaFX 我有一个包含 10 个项目的复选框 我编译并运行该程序 如果我将程序窗口移至监视器屏幕的底部 下拉列表将从监视器屏幕中消失 无法将项目点击出屏幕 相反 如果我尝试使用场景生成器 2 0
  • Visual Studio 中列表框的上移、下移按钮[重复]

    这个问题在这里已经有答案了 我正在尝试制作一个上移按钮和一个下移按钮 以移动 Microsoft Visual Studio 2012 中列表框中的选定项目 我已经在 WDF jquery winforms 和其他一些表单中看到了其他示例
  • 如何禁用 Yii2 中的按钮

    我正在尝试禁用创建项目 Button当用户未登录时 该按钮将Hide or disable 这是我的条件 p p 它正在工作 但是 当用户登
  • 如何通过单击按钮调用 PHP 函数

    我创建了一个名为的页面functioncalling php包含两个按钮 Submit and Insert 我想测试单击按钮时执行哪个函数 我希望输出出现在同一页面上 因此 我创建了两个函数 每个按钮一个
  • 复选框选择与 TableView 绑定

    How to bind with TableView selection model with checkbox isSelected in table view In manually using mouse multiple selec
  • JavaFX 动画使用循环?

    我正在尝试制作一款类似太空侵略者的游戏 我画了一个正方形 我想通过使用循环逐步向下移动它thread sleep 然而 正方形立即被绘制出来 我知道有可以使用的动画路径 但我想保持低水平并仅使用坐标系 有没有办法使用这样的循环来制作时间轴动
  • 从 IntelliJ 运行 JavaFX 应用程序

    Versions openjdk版本 11 0 11 2021 04 20 OpenJDK 运行时环境 build 11 0 11 9 Ubuntu 0ubuntu2 20 10 OpenJDK 64 位服务器虚拟机 内部版本 11 0 1
  • 当在 Visual Studio Code 中设置 isDevelopment 时

    I want reload window using shortcut key it is already defined to ctrl R 但不知道如何使用快捷键重新加载窗口 你能解释一下我如何处于 isDevelopment 状态吗
  • 从更多元素中仅获取唯一名称

    我动态渲染了 HTML 其中列出了未确定数量的单选按钮 这些按钮的名称代表数据库中的某些 id 我需要收集收音机的所有唯一名称 这是一个例子
  • FXML 文件中的 getHostServices().showDocument()

    有没有简单的方法可以将 getHostServices showDocument 命令放入 toHomepage 方法中 而不是执行一行又一行的代码 这样代码应该看起来干净简单 package sample import javafx ap

随机推荐

  • 无法使用 Android BluetoothProfile 连接到蓝牙 Health Device Fora

    我想通过 Android BluetoothPROfile 连接到 Fora 温度计并获取读数 以下是我的方法 在 OnCreate 中我写了这段代码 if mBluetoothAdapter getProfileProxy this mB
  • 使用 Json.net 序列化时如何根据类型更改属性名称?

    我有一个类型的属性object我必须根据它的类型更改名称 应该非常类似于 XmlElement PropertyName typeof PropertyType XML 的属性 例如 我有一个房产public object Item get
  • 延迟加载变量错误

    我正在编写一个涉及核心数据的程序 我为我创建了一个类变量context and entity并将我的代码写成这样 class PersistencyManager var context NSManagedObjectContext let
  • 无法使用 Node.js 将大块数据填充到 mongodb

    我被要求导入从全市许多站点收集的大量天气数据 每个站点有 1 台计算机 每个计算机有一个文件夹 每 5 分钟同步到一台中央服务器 每天都会创建一个新文件 所以 基本上结构是这样的 一个txt文件的格式为csv文件 其中第一行为字段 其余为数
  • PATH_TRANSLATED 中的redirect:// 是什么?

    我有一个 htaccess通过请求的规则 类别 类别 slug to 类别 php 然而 当我检查 SERVER超级全局 我得到这个条目 Array PATH TRANSLATED gt redirect 那是什么 我从未见过重定向 bef
  • allow_tags=True 不会在 django admin 中渲染
    标签

    我想在 django admin 的 list display 中显示一个表单 但我遇到了这个问题 当我定义这样的东西时 class MyModelAdmin admin ModelAdmin list display foo pagar
  • 识别并填充列表框

    这对我来说是一个谜 填充列表框的语法是什么 但首先 如何识别列表框 我在很多论坛上读到 ListBox1 Additem 但是他们怎么知道它是 ListBox1 这是默认名称ListBox当您将其添加到表单时进行控制 VB 和 VBA 自动
  • CUDA 上的块间屏障

    我想在 CUDA 上实现块间屏障 但遇到了严重的问题 我不明白为什么它不起作用 include
  • PHP Guzzle 5:无法处理包含端口号的 URL

    我正在使用最新版本的guzzle from composer json guzzlehttp guzzle 5 from composer lock name guzzlehttp guzzle version 5 2 0 当我尝试使用包含
  • Javafx如何在webview中显示自定义字体?

    该网页使用了我的电脑上未安装的自定义字体 在这种情况下 WebView似乎使用操作系统的默认字体 但我有字体文件 xx ttf 如何将字体嵌入到我的应用程序中并告诉 WebView 使用它来识别页面上的字体 加载字体 Font loadFo
  • Pandas 将列拆分为多级

    我有一个像这样的数据框 df pd DataFrame pd DataFrame 1 2 3 4 5 6 7 8 9 10 11 12 columns X a Y b X b Y a X a Y b X b Y a 0 1 2 3 4 1
  • 如何在linux终端中再次打开进程?

    我从我的家用电脑上使用 putty 通过 ssh 连接到远程服务器 然后运行了一个需要几个小时才能完成的 python 程序 并且在运行时会打印一些内容 现在过了一会儿 我的互联网断开了 我不得不关闭并重新打开 putty 和 ssh 如果
  • phpmailer 无法从表单发送附件

    搜索 stackoverflow 后我没有得到任何问题的答案 问题是我有一个带有上传按钮的表单 因此当用户提交文件时 该文件将立即通过电子邮件发送给我 我使用 phpmailer 但我只收到消息而不是消息 附件 知道问题出在哪里吗 PS 我
  • Swift 3 - 为什么我的导航栏没有显示?

    我有一个简单的应用程序来测试 REST API 的推送通知 我想在应用程序中显示导航栏 但它不起作用 在我的 AppDelegate 中 我有以下代码 func application application UIApplication d
  • 合并两个列表python

    我有两个清单 a 1 2 3 4 5 6 b 7 8 我想将它合并到 c 1 2 3 7 4 5 6 8 I used zip a b 但结果似乎不正确 有人可以帮忙吗 zip 只会将元组和整数配对 您还需要连接元组和新项目 c aa bb
  • 使用 post/sendmessage 进行鼠标点击不起作用[重复]

    这个问题在这里已经有答案了 可能的重复 如何在C 中模拟鼠标点击 我努力了 Window FindWindow null untitled Paint PostMessage WindowToFind WM MOUSEMOVE 0 loca
  • 组合框的默认值

    您好 我尝试为组合框设置默认值 XAML
  • 检查范围内的 int

    java中是否有一种优雅的方法来检查int是否等于某个值 或者是否比某个值大 小1 例如 如果我检查x在身边5 我想返回 true4 5 and 6 因为 4 和 6 与 5 只相差一 有内置函数可以做到这一点吗 或者我这样写会更好吗 in
  • 如何使用 Jquery 为文件上传中选择的多个图像提供预览?

    大家好 我有一个 fileuplaod 用户可以在其中选择多个图像 我想在上传之前显示这些所选图像的预览 目前我将其管理为单个图像预览 我如何为所选的多个图像提供预览 function readURL input var img input
  • 使用 JavaFX 2.2 助记符(和加速器)

    我正在尝试让 JavaFX 助记符发挥作用 我在场景中有一些按钮 我想要实现的是通过按 Ctrl S 来触发此按钮事件 这是一个代码骨架 FXML public Button btnFirst btnFirst getScene addMn