将侦听器添加到JPanel中的所有对象

时间:2013-05-03 20:50:53

标签: java swing jpanel listeners

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

3 个答案:

答案 0 :(得分:1)

JPanel扩展JComponent,继承Container。您可以使用getComponents()。你得到一个Component[]数组,你可以遍历并为每个组件添加,这是Component的子类,如Button,并为每个组件添加相同的ActionListener 。见http://docs.oracle.com/javase/6/docs/api/java/awt/Component.html

答案 1 :(得分: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 );
        }
    }
}

答案 2 :(得分: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);
            }
        }
    }