是否有可能在java中有一个类,它有eventhandler与不同的功能?例如,button1将登录您,而button2将注销您,这是可能的吗?这是我做的代码,它似乎不工作。
package event.handlers;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TheHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent logInEvent) {
System.out.println("Button Login");
}
public void actionPerformed(ActionEvent cancelEvent) {
System.out.println("Cancel Login");
}
}
您需要ActionListener的两个实现,每个按钮一个,或者actionPerformed需要通过event参数确定按钮并采取适当的操作。您的代码将无法编译,因为这两个方法的签名是相同的。
No。不能让一个类实现具有相同函数签名的两个方法。编译器如何知道为不同的事件调用哪一个?你给参数的名字对编译器没有任何意义。
作为一种替代方法,如果您希望所有内容都在同一个类中,您可以创建多个匿名操作侦听器,这些侦听器只需将调用转发给具有唯一名称的方法。
public class TheHandler {
public TheHandler() {
JButton login, cancel;
//initialize code here
login.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent logInEvent) {
loginPerformed(logInEvent);
}
});
cancel.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent cancelEvent) {
cancelPerformed(cancelEvent);
}
});
}
public void loginPerformed(ActionEvent logInEvent) {
System.out.println("Button Login");
}
public void cancelPerformed(ActionEvent cancelEvent) {
System.out.println("Cancel Login");
}
}
您可以使用ActionEvent的getSource()
或getActionCommand()
方法
@Override
public void actionPerformed(ActionEvent logInEvent) {
Object src=logInEvent.getSource();
String cmd=logInEvent.getActionCommand(); //It will return caption of button
if(src==btn1)
{
//
}
//Or
if(cmd.equals("Button1")) { ... }
}
一个类中不能有多个actionPerformed
方法。简单的方法是根据动作源进行操作,如:
(in actionPerformed method)
if(e.getSource() == loginButtton) { // based on button variable if they are in same class and accessible in actionPerformed method
loginMethod()
} else if(e.getSource == logoutButton) {
logoutMethod()
}
或
if(e.getActionCommand().equals("loginButtton")) { // based on caption/text on button
loginMethod()
} else if(e.getActionCommand().equals("logoutButtton")) {
logoutMethod()
}
或者你可以为不同的按钮设置不同的匿名类,比如
loginButton.addActionListner(new ActionListerner(){
public void actionPerformed(ActionEvent loginEvent) {
loginMethod();
}
});
logoutButton.addActionListner(new ActionListerner(){
public void actionPerformed(ActionEvent cancelEvent) {
logoutMethod();
}
});
问题是您的两个方法签名是相同的。当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加载的另一个东西)。