Класс обработчиков событий - PullRequest
1 голос
/ 19 декабря 2011

возможно ли в java иметь класс, для которого есть EventHandlers с различными функциями? например, 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");
    }
}

Ответы [ 5 ]

2 голосов
/ 19 декабря 2011

Вам либо понадобятся две реализации ActionListener, по одной для каждой кнопки, либо actionPerformed должен определить кнопку по аргументу события и предпринять соответствующее действие. Ваш код не будет компилироваться, потому что подписи для обоих методов одинаковы.

1 голос
/ 19 декабря 2011

Нет. Вы не можете иметь класс, реализующий два метода с одинаковой сигнатурой функции. Как бы компилятор узнал, какой из них вызывать для разных событий? Имя, которое вы даете аргументам, не имеет никакого значения для компилятора.

В качестве альтернативы вы можете создать несколько прослушивателей анонимных действий, которые просто перенаправляют вызов методу с уникальным именем, если вы хотите, чтобы все было в одном классе.

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");
    }
}
0 голосов
/ 19 декабря 2011

Проблема в том, что ваши две сигнатуры метода идентичны.Когда 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).

0 голосов
/ 19 декабря 2011

Нельзя использовать несколько методов actionPerformed в одном классе. Простой способ - выполнить операцию на основе источника действия, например:

(в методе actionPerformed)

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();
    }
});
0 голосов
/ 19 декабря 2011

Вы можете использовать getSource() или getActionCommand() метод ActionEvent.

@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")) { ... }

}
...