1

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");
    }
}
4

5 に答える 5

2

各ボタンに 1 つずつ、ActionListener の 2 つの実装が必要か、actionPerformed がイベント引数によってボタンを決定し、適切なアクションを実行する必要があります。両方のメソッドの署名が同じであるため、コードはコンパイルされません。

于 2011-12-19T13:13:20.877 に答える
1

いいえ。同じ関数シグネチャを持つ 2 つのメソッドをクラスに実装させることはできません。コンパイラは、さまざまなイベントに対してどちらを呼び出すかをどのように知るのでしょうか? 引数に付けた名前は、コンパイラには意味がありません。

別の方法として、すべてを同じクラスにしたい場合は、複数の匿名アクション リスナーを作成して、一意の名前を持つメソッドに呼び出しを転送することができます。

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");
    }
}
于 2011-12-19T13:13:16.483 に答える
0

問題は、2 つのメソッド シグネチャが同一であることです。Java がどちらのメソッドを呼び出すかを判断しようとするとき、2 つのメソッドの違いを判別できません。

あなたが望むことをするための2つの方法を考えることができます:

おそらく、 のようなボタンにリスナーを登録しています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 がロードする別のものです)。

于 2011-12-19T13:26:50.817 に答える
0

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

}
于 2011-12-19T13:15:35.540 に答える
0

actionPerformed1 つのクラスに複数のメソッドを含めることはできません。簡単な方法は、次のようなアクションのソースに基づいて操作を行うことです。

(in 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();
    }
});
于 2011-12-19T13:17:10.980 に答える