JPanel keylistener

Bic*_*ick 9 java swing jpanel

我正在尝试添加一个关键的监听器JTabbedPane.
它应该在收到ctrl + tab时切换标签.
但是keypressed事件从未发送过我尝试将其添加到面板和选项卡式对象 - 但没有成功.

这是我的代码

SwitchTabsListener ctrlTabListener = new SwitchTabsListener(genericTabbedPanel);  
jMainFrame.addKeyListener(ctrlTabListener);  
genericTabbedPanel.addKeyListener(ctrlTabListener);  
Run Code Online (Sandbox Code Playgroud)

Rid*_*del 15

在典型的方式中,您的键事件不会被正确的Swing组件拦截.您必须了解光标下方的第一个组件将接收键盘事件.如果你用键盘选择一个按钮,那将是这个JButton会收到关键事件.

为了确保获得所有这些事件,您不必在组件上注册,而是使用a KeyboardFocusManager,它将在任何地方接收关键事件.

然后,您的代码需要以下元素

KeyEventDispatcher myKeyEventDispatcher = new DefaultFocusManager();
KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(myKeyEventDispatcher);
Run Code Online (Sandbox Code Playgroud)

myKeyEventDispatcher然后,dispatchKeyEvent无论何时按下按键,都会接收调用,无论它在UI中的哪个位置.这样,您可以确保正确调用您的代码.

注册密钥监听器的另一种方法是要求您使用a HierarchyListener来按顺序添加密钥监听器:删除每个看起来作为根组件的子级添加/删除的swing组件.这不仅编写起来很麻烦,而且很难调试和理解.

这就是为什么我更喜欢蛮力,但是将应用程序全局键监听器添加到特定键盘焦点管理器的方式却相当优雅.