我有一个包含许多对象的 JPanel,并且可以执行一个主要操作:计算。有一个按钮可以执行此操作,还有一个 JTextField 和其他用户可能希望在其中按 enter 的组件。例如,如果您从 JComboBox 中选择某些内容并按 enter,则将进行计算。有没有一种简单的方法可以将这样的侦听器添加到 JPanel 的所有内容中,而不是将 actionListeners 添加到每个组件中?
问问题
3402 次
3 回答
1
JPanel
扩展JComponent
,即继承Container
。您可以使用getComponents()
. 你得到一个Component[]
数组,你可以循环并为每个组件添加它,它是 like 的子类Component
,Button
并为每个组件添加相同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 回答