1

我有一个包含许多对象的 JPanel,并且可以执行一个主要操作:计算。有一个按钮可以执行此操作,还有一个 JTextField 和其他用户可能希望在其中按 enter 的组件。例如,如果您从 JComboBox 中选择某些内容并按 enter,则将进行计算。有没有一种简单的方法可以将这样的侦听器添加到 JPanel 的所有内容中,而不是将 actionListeners 添加到每个组件中?

4

3 回答 3

1

JPanel扩展JComponent,即继承Container。您可以使用getComponents(). 你得到一个Component[]数组,你可以循环并为每个组件添加它,它是 like 的子类ComponentButton并为每个组件添加相同ActionListener的。请参阅http://docs.oracle.com/javase/6/docs/api/java/awt/Component.html

于 2013-05-03T21:04:24.267 回答
0

@cinhtau 有正确的方法。由于没有具有“addActionListener”方法的通用类型,这使得它变得更加困难。您必须检查要为其添加动作侦听器的每种情况。

public static void addActionListenerToAll( Component parent, ActionListener listener ) {
    // add this component
    if( parent instanceof AbstractButton ) {
        ((AbstractButton)parent).addActionListener( listener );
    }
    else if( parent instanceof JComboBox ) {
        ((JComboBox<?>)parent).addActionListener( listener );
    }
    // TODO, other components as needed

    if( parent instanceof Container ) {
        // recursively map child components
        Component[] comps = ( (Container) parent ).getComponents();
        for( Component c : comps ) {
            addActionListenerToAll( c, listener );
        }
    }
}
于 2013-05-03T23:01:33.543 回答
0

这就是我现在所做的,它奏效了

private void setActionListeners() {
        for (Component c : this.getComponents()){
            if (c.getClass() == JMenuItem.class){
                JMenuItem mi = (JMenuItem) c;
                mi.addActionListener(this);
            }
            if (c.getClass() == JCheckBoxMenuItem.class){
                JCheckBoxMenuItem cmi = (JCheckBoxMenuItem) c;
                cmi.addActionListener(this);
            }
        }
    }
于 2013-07-14T23:24:46.043 回答