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