当前位置: 首页 > 面试题库 >

通过编辑控件传递上下文菜单快捷方式

阳修永
2023-03-14
问题内容

我有一个JavaFX窗格(如果有关系,则为TabPane),并带有与其关联的上下文菜单。上下文菜单中定义了一些快捷键(F2,F3),实际上,当按下快捷键时,将执行正确的操作。但是,在TextField或ComboBox内部时,快捷键将被完全忽略。

为什么会发生这种情况,我该如何克服呢?如果可能的话,我想避免为每个控件设置“ onKeyPressed”。

(编辑:显然是具有ContextMenu的TabPane。出于某种原因,我无法理解普通的Panes不能具有上下文菜单,但是TabPane是一个控件。不知道它是否更改了任何内容)

编辑:提供的是一个最小的示例:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCombination;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Example extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {

        VBox vbox = new VBox();
        vbox.getChildren().add(new TextField());

        TabPane tp = new TabPane();
        Tab t = new Tab("foo");
        t.setContent(vbox);

        tp.getTabs().add(t);

        ContextMenu cm = new ContextMenu();
        MenuItem mi = new MenuItem("Action");
        mi.setAccelerator(KeyCombination.keyCombination("F2"));
        mi.setOnAction(ev->{ System.out.println("Action!"); });
        cm.getItems().add(mi);

        tp.setContextMenu(cm);
        Scene sc = new Scene(tp);

        stage.setScene(sc);

        stage.show();
    }
}

请注意,F2在TextField内部按下时不执行任何操作,而在非TextField内部按下时则打印出“动作!”。


问题答案:

我已经找到了解决该问题的回旋解决方案:EventFilter在TabPane上添加一个-即使在编辑控件具有焦点时也会触发:

tabPane.addEventFilter(KeyEvent.KEY_PRESSED, this::keyPressed);

使用它作为keyPressed函数:

private void keyPressed(KeyEvent event) {
  for (MenuItem mi : tabPane.getContextMenu().getItems())
     {
        if (mi.getAccelerator()!=null && mi.getAccelerator().match(event))
        {
            mi.getOnAction().handle(null);
            event.consume();
            return;
        }
    }
}

消耗事件很重要,因此,如果未选择任何编辑控件,则不会触发两次。如果您有嵌套菜单,这显然将不起作用,但是在我的情况下,它是一个平面上下文菜单。

如果此解决方案有任何可怕的错误,或者解决此问题的更直接的方法-请让我知道!

编辑 :可能需要增加!mi.isDisable()触发条件,以避免禁用菜单项的触发事件。



 类似资料:
  • 您可在单项训练暂停期间,以及多项运动训练过渡模式期间,在训练准备模式下访问快捷菜单。在训练准备模式中,您可通过轻触图标或使用 LIGHT(背光灯)按钮访问快捷菜单。在暂停和过渡模式中,仅可使用 LIGHT(背光灯)按钮访问快捷菜单。 快捷菜单中显示的选项取决于您选择的运动,以及是否正在使用 GPS。   节能设置: 节能设置允许您通过更改 GPS 记录速率,关闭手腕型心率测量和使用屏幕保护程序,延

  • 您可在单项训练暂停期间,以及多项运动训练过渡模式期间,在训练准备模式下访问快捷菜单。在训练准备模式中,您可通过轻触图标或使用 LIGHT(背光灯)按钮访问快捷菜单。在暂停和过渡模式中,仅可使用 LIGHT(背光灯)按钮访问快捷菜单。 快捷菜单中显示的选项取决于您选择的运动,以及是否正在使用 GPS。   节能设置: 节能设置允许您通过更改 GPS 记录速率,关闭手腕型心率测量和使用屏幕保护程序,延

  • Windows95和Windows 3.x在界面上的一个重大差别就是Windows95增加了功能强大的右键快捷菜单。在任何一个对象上按鼠标右键,就会弹出一个与所选当前对象相关的菜单,菜单中列出了一组针对当前对象的操作。在Visual Studio中就有大量这样的菜单。比如,在项目工作区中单击右键时弹出菜单,让用户选择Docking View(停泊视图)、Hide(隐藏)和Properties(属性

  • 类似的问题没有解决我的问题:https://stackoverflow.com/a/36633892/2300773 在基于connect()的场景中使用 通过上下文传递存储区不起作用 由于react-router不将当前param作为上下文提供,所以我选择将当前param作为路由组件中的上下文添加。我可以一直访问组件树下的上下文,直到到达使用connect()设置的子组件为止。页面的初始呈现为子

  • MinDoc 使用的Markdown编辑器是基于 editor.md 改造而来,大部分功能都和原版保持一致。常用的快捷键如下: Keyboard shortcuts (键盘快捷键) 说明 Description F9 切换实时预览 Switch watch/unwatch F10 全屏HTML预览(按 Shift + ESC 退出) Full preview HTML (Press Shift +

  • WooCommerce网站的插件一般较多,这样后台菜单会很长,想找到自己想用的功能会有困难。因此,本文介绍一种在wp admin bar增加WooCommerce admin bar快捷菜单的方法。 本文用到了自定义WordPress admin bar菜单中提到的方法。 WooCommerce admin bar快捷菜单代码 代码放在子主题的functions.php中。 if( is_user