Java 是否有一种更动态的方式将侦听器添加到父级中的所有组件?

Java 是否有一种更动态的方式将侦听器添加到父级中的所有组件?,java,swing,listener,user-input,jcomponent,Java,Swing,Listener,User Input,Jcomponent,现在,我正在重写JFrame.addKeyListener(KeyListener),检查其内容窗格中的组件,然后将侦听器添加到所有这些组件中(在使用super调用原始方法之后) 我不确定这是否是将侦听器添加到组件层次结构的常用方法,但这是我唯一能想到的方法。标准JDK中是否已经内置了用于此目的的内容 不用问为什么 当然有,因为每当我看到任何人使用KeyListener时,我知道几乎总是有更好的方法来解决问题 我希望无论焦点是什么,都能触发KeyEvents 还是不是很清楚 例如,人们通常不会在

现在,我正在重写
JFrame.addKeyListener(KeyListener)
,检查其内容窗格中的组件,然后将侦听器添加到所有这些组件中(在使用super调用原始方法之后)

我不确定这是否是将侦听器添加到组件层次结构的常用方法,但这是我唯一能想到的方法。标准JDK中是否已经内置了用于此目的的内容

不用问为什么

当然有,因为每当我看到任何人使用KeyListener时,我知道几乎总是有更好的方法来解决问题

我希望无论焦点是什么,都能触发KeyEvents

还是不是很清楚

例如,人们通常不会在JButton上监听KeyEvents。
ActionListener
用于处理按键的键盘按下。或者,一些人已经建议使用
键绑定
,这可能更合适

或者在文本组件上,您可以使用
DocumentListener

最后,如果您真的认为需要收听所有事件,则可以使用“AWTEventListener”。有关更多信息,请参阅


因此,是的,为什么很重要。

问题是“为什么?”通过使用键绑定,您可以控制触发关键事件的焦点级别……再次强调这一点:这听起来像是在寻找不需要问为什么的问题。感谢您回答我的问题(向我展示密钥绑定),但我为什么还要这样做呢?我希望无论focusKey绑定为您提供了触发按键事件(在某些按键上)的能力,都能触发按键事件。它们提供了更好的焦点控制管理,因此您的组件不必具有焦点才能触发关键事件。它们基于
Action
s API,该API提供了一个自包含且可配置的对象,可应用于菜单和按钮,减少了复制代码的需要,也减少了使用
ActionListener
s进行精彩翻滚的需要。“为什么?”是因为,取决于你正在尝试做什么,键绑定可能不是最佳选择……感谢所有的信息:)我担心的是触发键事件,不管什么是焦点,只要应用程序打开并处于焦点状态。我会研究钥匙装订,我以前从未听说过。再次感谢!
JFrame frame = new JFrame() {
    public void addKeyListener(KeyListener l) {
        super.addKeyListener(l);
        for(Component c : getContentPane().getComponents()) {
            c.addKeyListener(l);
        }
    }
};