Java Swing中的可链接键盘处理程序

Java Swing中的可链接键盘处理程序,java,swing,event-handling,focus,Java,Swing,Event Handling,Focus,我有一个来自JPanel的自定义组件子类,带有一个键盘处理程序。我的主应用程序将其嵌入到另一个JPanel中。现在,我希望父JPanel也响应击键,因为只有当组件处于焦点时,才需要执行一些操作,但这些操作适用于整个应用程序,而不是该组件(例如,当我点击Ctrl-R时,我希望有一个单独的状态窗口刷新自己,但只有当我的组件具有键盘焦点时才需要) 现在,我通过显式地向我的构造函数传递一个处理程序来实现这一点,当它完成时,它的KeyListener会调用该处理程序,但是使用swing的本机方式(如果有的

我有一个来自JPanel的自定义组件子类,带有一个键盘处理程序。我的主应用程序将其嵌入到另一个JPanel中。现在,我希望父JPanel也响应击键,因为只有当组件处于焦点时,才需要执行一些操作,但这些操作适用于整个应用程序,而不是该组件(例如,当我点击Ctrl-R时,我希望有一个单独的状态窗口刷新自己,但只有当我的组件具有键盘焦点时才需要)


现在,我通过显式地向我的构造函数传递一个处理程序来实现这一点,当它完成时,它的KeyListener会调用该处理程序,但是使用swing的本机方式(如果有的话)可能会更干净。是否支持这种将容器层次结构链接起来的处理程序?我已经研究了KeyboardFocusManager和KeyEventHandler,但它们的作用域似乎是全局的,而我希望将某些内容限制在一个容器中,该容器仅在其一个子容器具有键盘焦点时触发。

如果您只考虑在特定组件具有焦点时触发事件,更好的方法可能是在组件上使用,并在组件获得/失去焦点时让它添加/删除KeyListener

例如:

FocusListener focusListener = new FocusListener() {
    public void focusGained(FocusEvent event) {
        event.getComponent().addKeyListener(keyListener);
    }

    public void focusLost(FocusEvent event) {
        event.getComponent().removeKeyListener(keyListener);
    }

};
KeyListener listener = new KeyAdapter() {
   public void keyPressed(KeyEvent event) {
      //...do some processing...
      event.consume();
   }
};
所有InputEvents(其中派生了KeyEvents)向上传播组件继承权,从具有焦点的组件开始,向上移动到其父级,直到它们到达层次结构的根(基本上是包含窗口)

如果要防止在特定组件具有焦点时传播特定事件,则在事件处理程序完成后调用该事件将阻止对其进行处理

例如:

FocusListener focusListener = new FocusListener() {
    public void focusGained(FocusEvent event) {
        event.getComponent().addKeyListener(keyListener);
    }

    public void focusLost(FocusEvent event) {
        event.getComponent().removeKeyListener(keyListener);
    }

};
KeyListener listener = new KeyAdapter() {
   public void keyPressed(KeyEvent event) {
      //...do some processing...
      event.consume();
   }
};

您还可以尝试向组件添加键绑定器


这将向您展示如何使用键绑定。键绑定允许您在特定组件具有某种焦点时指定要执行的特定组件操作,并且可以用于扩展JComponent的任何对象。这可以在所有JComponent中更广泛地使用,并支持不同的焦点类型,例如,当组件单独具有焦点或其窗口具有焦点时。添加和删除密钥侦听器可能会导致小错误潜入您的应用程序,特别是当焦点侦听器失灵时,因此选择该路径时要小心。

我尝试过,但没有成功:只有标签的密钥侦听器被触发。谢谢,当焦点侦听器组件的“祖先”看起来正是我所需要的