2011-12-19 11 views
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"); 
    } 
} 

答えて

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

どのように実装されていますか?それはしませんか? – KyelJmD

+0

他のクラスのボタンを登録するにはどうすればよいですか? – KyelJmD

+0

@KyelJmD:あなたはあなたが望む任意のメソッドを 'ActionListener'コールすることができます。そのメソッドが別のクラスに存在する場合、TheHandlerはそのクラスのインスタンスへの参照を必要とします。これは、オブジェクトに対してメソッドを呼び出すことと同じではありません。 'ActionListener'定義の中でそれをやっているだけです。 – unholysampler

2

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

+0

私はクラスが含まれている例を提供することができますか? – KyelJmD

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

} 
0

1つのクラスに複数の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() 
} 

たり、別のボタンに別の匿名クラスを持つことができます(actionPerformedメソッドに)

:簡単な方法は次のようにアクションのソースに基づいて操作を行うことですlike

loginButton.addActionListner(new ActionListerner(){ 
    public void actionPerformed(ActionEvent loginEvent) { 
     loginMethod(); 
    } 
}); 
logoutButton.addActionListner(new ActionListerner(){ 
    public void actionPerformed(ActionEvent cancelEvent) { 
     logoutMethod(); 
    } 
}); 
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コールのすぐ隣にコードが表示されているので、より明確になりますが、多くの定型文が追加されます。また、読み込みに時間がかかる非常に大きなprogectを処理している場合は、少し速くロードしてください(各匿名の内部クラスは、JVMがロードする別のものです)。

+0

彼らはすべて混乱しているので、私は内部クラスを持っているとは思わない、他の方法はありますか?それに対して私は別の方法がありますか? – KyelJmD

+0

内部クラスを使用しない2番目のオプションを試してください。 – Dogmatixed

+0

どうすれば登録できますか? cancelButton.addActionlistenr(ハンドラ)のように。 ?? – KyelJmD