gpt4 book ai didi

javafx - 如何让 JavaFX MenuItem 响应 TAB 按键?

转载 作者:行者123 更新时间:2023-12-05 05:26:19 24 4
gpt4 key购买 nike

JavaFX MenuItem 可以通过设置 ActionEvent EventHandler 来响应大多数 KeyPress 事件。但是,虽然事件处理程序确实捕获了 KeyCode.ENTER 的 KeyPress,但它不会捕获 KeyCode.TAB KeyPress 事件。显然,一些像 TAB 这样的关键事件是在更深层次上处理的。例如,箭头键可以遍历菜单。

My ContextMenu 是用户已开始在 TextField 中键入的电子邮件地址字符串的完成列表。用户要按方向键选择所需的项目,按TAB键执行补全。

我可以将事件处理程序附加到 ContextMenu 本身并捕获 TAB 按键。但是事件的来源是 ContextMenu,我在 ContextMenu 中找不到任何变量指示按下 TAB 键时哪个 MenuItem 被突出显示。 MenuItem 允许 css 样式控制焦点中菜单项的外观,但它没有任何属性表明它是否处于焦点中。

我曾尝试通过 MenuItem buildEventDispatchChain() 使用 EventDispatchChain,但无济于事。似乎没有办法拦截 TAB 按键或以其他方式确定按下 TAB 键时哪个菜单项处于焦点。

有什么建议吗?

最佳答案

如果我没看错,你想覆盖默认的按键监听器来添加你自己的响应,所以我们必须找到它的应用位置。

为了让它工作,我们必须亲自动手使用私有(private) API...

ContextMenu 皮肤 (ContextMenuSkin) 使用 ContextMenuContent 对象作为包含所有项目的容器。这些项目中的每一项也位于 ContextMenuContent.MenuItemContainer 容器中。

我们可以覆盖父容器上的按键监听器,同时我们可以为项目容器上的项目添加一个 focusedProperty 监听器。

使用这个私有(private) API

import com.sun.javafx.scene.control.skin.ContextMenuContent;

这对我有用:

private ContextMenuContent.MenuItemContainer itemSelected=null;

@Override
public void start(Stage primaryStage) {

MenuItem cmItem1 = new MenuItem("Item 1");
cmItem1.setOnAction(e->System.out.println("Item 1"));
MenuItem cmItem2 = new MenuItem("Item 2");
cmItem2.setOnAction(e->System.out.println("Item 2"));

final ContextMenu cm = new ContextMenu(cmItem1,cmItem2);

Scene scene = new Scene(new StackPane(), 300, 250);
scene.setOnMouseClicked(t -> {
if(t.getButton()==MouseButton.SECONDARY || t.isControlDown()){
cm.show(scene.getWindow(),t.getScreenX(),t.getScreenY());

ContextMenuContent cmc= (ContextMenuContent)cm.getSkin().getNode();

cmc.setOnKeyPressed(ke->{
switch (ke.getCode()) {
case UP: break;
case DOWN: break;
case TAB: ke.consume();
if(itemSelected!=null){
itemSelected.getItem().fire();
}
cm.hide();
break;
default: break;
}
});
VBox itemsContainer = cmc.getItemsContainer();
itemsContainer.getChildren().forEach(n->{
ContextMenuContent.MenuItemContainer item=(ContextMenuContent.MenuItemContainer)n;
item.focusedProperty().addListener((obs,b,b1)->{
if(b1){
itemSelected=item;
}
});
});
}
});

primaryStage.setScene(scene);
primaryStage.show();
}

关于javafx - 如何让 JavaFX MenuItem 响应 TAB 按键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26916195/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com