问题描述
我有一个JavaFX窗格(TabPane,如果需要的话)以及与之关联的上下文菜单。 上下文菜单中定义了一些快捷键(F2,F3),实际上,当按下快捷键时,将执行正确的操作。 但是,在TextField或ComboBox内部时,快捷键将被完全忽略。
为什么会发生这种情况,我该如何克服呢? 如果可能的话,我想避免为每个控件设置“ onKeyPressed”。
(编辑:显然是具有ContextMenu的TabPane。出于某种原因,我无法理解普通的Panes不能具有上下文菜单,但是TabPane是Control。不知道它是否更改了任何内容)
编辑:提供的是一个最小的示例:
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();
}
}
请注意,在TextField内部按下F2
不会执行任何操作,而在不在其内部按下F2
则会打印出“ Action!”。
1楼
我已经找到了解决该问题的回旋解决方案:在EventFilter
上添加一个EventFilter
即使在编辑控件具有焦点时也会触发:
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()
添加到触发条件,以避免触发禁用菜单项的事件。