问题在于您的两个方法签名是相同的。当Java试图找出要调用的方法时,它无法分辨两者之间的区别。
我能想到的两种方法可以做到你想要什么:
想必,你上的按钮注册听众像cancelButton.addActionListener(...)
。所以,你可以提供每个按钮都有自己的匿名内部类:
loginButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent logInEvent) {
System.out.println("Button Login");
}
}
cancelButton.addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent cancelEvent) {
System.out.println("Cancel Login");
}
}
,或者你可以定义检查呼叫源的单一actionPerformed方法:
public class TheHandler implements ActionListener {
JButton loginButton;
JButton cancelButton;
public TheHandler()
{
...
// Now, technically, this is bad form because you're leaking 'this'.
// But as long as this will only be called after this constructor finishes
// initializing, it's safe.
loginButton.addActionListener(this);
cancelButton.addActionListener(this);
...
}
...
@Override
public void actionPerformed(ActionEvent evt) {
if(evt.getSource() == loginButton)
System.out.println("Button Login");
else if(evt.getSource() == cancelButton)
System.out.println("Cancel Login");
}
}
使用匿名内部类有时更清楚一点,因为你看到addListener调用旁边的代码,但它也增加了很多样板,如果你正在处理一个可能需要一段时间才能加载的非常大的项目,有时候可以减少类的数量使其加载速度更快一些(每个匿名内部类是JVM加载的另一件事)。
他们的实现如何?不会那样吗? – KyelJmD 2011-12-19 13:16:34
如何注册其他课程的按钮? – KyelJmD 2011-12-19 15:25:39
@KyelJmD:你可以让'ActionListener'调用你想要的任何方法。如果该方法恰好在不同的类中,那么'TheHandler'需要对该类的一个实例的引用。这与在对象上调用方法没有任何区别。你只是在你的'ActionListener'定义中这样做。 – unholysampler 2011-12-19 15:31:45