事件处理程序的类



是否有可能在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加载的另一个东西)。

相关内容

  • 没有找到相关文章

最新更新