2016-05-12 62 views
0

[首先,我看过这个答案,但我明白我的是不同Add actionListener to a lot of JButton]添加一个通用的ActionListener许多Jbutton将或JComponents或JTextFields将

我有一系列的JTextField,我需要时,他们的价值观做一些事情已更新。通常我需要做myAction(JTextField jt)与他们所有人。

现在我使用此代码来做到这一点,但我必须为我的每一个JTextField做一个代码的实例,我只想做一次。

myJTextField1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      //change some value here! 
      myAction(myJTextField1); 
     } 
    }); 
//repeat for myJTextFields-2-to-9 

这是我试过的,但它不起作用,因为jt无法访问。

void addListener(JTextField jt){ 
    jt.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      //change some value here! 
      myAction(jt); 
     } 
    }); 
} 

我也尝试过类似jt.addActionListener(new myListener implements ActionListener (jt){但我真的不知道该怎么类似的东西。

+1

一个'DocumentListener'通常比一个'ActionListener'更好,当它涉及到一个'JTextComponent' .. –

回答

3

首先创建一个通用的ActionListener其提取JTextField上,从事件发生的动作:

ActionListener listener = new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     myAction((JTextField)e.getSource()); 
    } 
} 

或更短为lambda

ActionListener listener = e -> myAction((JTextField)e.getSource()); 

,然后注册它在你的文本框:

myJTextField1.addActionListener(listener); 
myJTextField2.addActionListener(listener); 
... 

更新:

如果你想用一个字符串参数每个文本字段关联,并且参数传递到您的myAction方法,你可以传输参数的名称字段:

myJTextField1.setName("param1"); 

和操作方法提取它:

public void actionPerformed(ActionEvent e) { 
     JTextField tf = (JTextField)e.getSource(); 
     myAction(tf, tf.getName()); 
    } 

当然这也可以在myAction中完成。

+0

真棒非常感谢 – fartagaintuxedo

+0

只有一个问题,如果我不得不将另一个参数传递给'myAction(JTextField jt)',然后这个参数会被更新,例如myAction(JTextField jt,String a)'这种方法还能工作吗? – fartagaintuxedo

+0

我打算使用'String a'来决定在'myAction'里面用'case'操作符做些什么。 – fartagaintuxedo

2

供参考:即使@wero的回答非常好,您可以更改您的方法以使其工作。

// to be accessible form an anonymous class variable must be declared as final! 
void addListener(final JTextField jt){ 
    jt.addActionListener(new ActionListener(){ 
     public void actionPerformed(ActionEvent e) { 
      //change some value here! 
      myAction(jt); 
     } 
    }); 
} 
+0

将变量'JTextField jt'声明为'final'有什么缺点? – fartagaintuxedo

+1

@fartagaintuxedo变量'jt'不能在方法中修改 –

+1

不能用'jt = ...'修饰,但'jt.setText(“..”)'可以正常工作 – Yazan

1

使类implements ActionListener

public class myClass extends abcd implements ActionListener { 

    public void someMethod(){ 
     myJTextField1.addActionListener(this); 
     myJTextField2.addActionListener(this); 
     myJTextField3.addActionListener(this);//add more ... 
    } 

    @override 
    public void actionPerformed(ActionEvent event) { 
     JTextField target = (JTextField)event.getSource(); 
     myAction(target); 
    } 
}