1

これは、ActionListener インターフェイスのトピックに関する「Head First Java 2nd Edition」にある、初心者向けの基本的な Java プログラムです。

このプログラムで使用されている用語の一部が理解できませんでした。

button.addActionListener(this);

このコードが実行されると、メソッド actionPerformed はどのようにトリガーまたは実行されますか、または使用する用語は??

//Program begins from now!!

import javax.swing.*;

import java.awt.event.*;

public class SimpleGui1B implements ActionListener {

    JButton button;

    public static void main(String[] args) {

        SimpleGui1B gui = new SimpleGui1B();
        gui.go();

    }

    public void go(){ //start go
        JFrame frame= new JFrame();
        button=new JButton("Click me");

        frame.getContentPane().add(button);

        button.addActionListener(this);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setSize(300,300);
        frame.setVisible(true);
    }//close go()

    public void actionPerformed(ActionEvent event){
        button.setText("I’ve been clicked!");

    }


}
4

7 に答える 7

2

このステートメントを分解してみましょう:

button.addActionListener(this);

さて、あなたはbuttonオブジェクトを参照しています。これは私が推測するタイプのオブジェクトですJButton。オブジェクトにはbuttonと呼ばれるメソッドがありaddActionListenerます。ActionListenerこれが行うことは、インターフェースを実装するオブジェクトを追加することです。

これが発生するクラスは、それらのオブジェクトの 1 つです。ご覧のとおり、上部に次のように書かれています。

public class SimpleGui1B implements ActionListener 

つまり、プログラムが行っていることは、現在のクラス ( this) がメソッドのパラメーターとして機能するということです。次に、このクラスを見ると、メソッドがありますactionPerformed

public void actionPerformed(ActionEvent event){
    button.setText("I’ve been clicked!");

}

これは、ボタンがクリックされるたびに、メソッド内のコードactionPerformedが呼び出されることを意味します。別の方法として、次のように言います。

button.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e)
      {
           // Add some code here.
      }

これはまったく同じことを行っていますが、括弧内でクラスを定義しているだけです。

于 2013-05-03T15:55:46.410 に答える
2

JButton クラスでは、キーボードとマウスのイベントが処理され、ボタンがクリックを検出すると、アクション リスナーを反復して呼び出します。

ActionEvent event = new ActionEvent(...);
for (ActionListener listener : addedListeners) {
    listener.actionPerformed(event);
}

リスナーは単なるコールバック オブジェクトです。

于 2013-05-03T15:53:56.523 に答える
1

コードを見てみましょう。

には、コードがある場所にjavax.swing.AbstractButton呼び出されるメソッドがあります。addActionListener

public void addActionListener(ActionListener l) {
  listenerList.add(ActionListener.class, l);
}

listenerListは次のように定義されjavax.swing.JComponentています。

protected EventListenerList listenerList = new EventListenerList();

イベントが発生するfireActionPerformedと javax.swing.AbstractButton が呼び出されます。コードは次のようになります。

protected void fireActionPerformed(ActionEvent event) {
  // Guaranteed to return a non-null array
  Object[] listeners = listenerList.getListenerList();
  ActionEvent e = null;
  // Process the listeners last to first, notifying
  // those that are interested in this event
  for (int i = listeners.length-2; i>=0; i-=2) {
    if (listeners[i]==ActionListener.class) {
      // Lazily create the event:
      if (e == null) {
        String actionCommand = event.getActionCommand();
        if(actionCommand == null) {
          actionCommand = getActionCommand();
        }
        e = new ActionEvent(AbstractButton.this,
            ActionEvent.ACTION_PERFORMED,
            actionCommand,
            event.getWhen(),
            event.getModifiers());
      }
      ((ActionListener)listeners[i+1]).actionPerformed(e);
    }
  }
}

最も重要な部分は、次の最後の行です。

((ActionListener)listeners[i+1]).actionPerformed(e);

これは、actionPerformed()メソッドを呼び出すコード行です

于 2013-05-03T16:00:39.170 に答える
0

基本的に、オブザーバーが自分自身をサブジェクトに登録するオブザーバー パターンを使用します。これがサブジェクトで何らかのイベント トリガーになるたびに、サブジェクトはさまざまなオブザーバーに通知します。ここで、Button はサブジェクトで、SimpleGui1B (基本的にはリスナー) はオブザーバーです。コード スニペットを見てみましょう。

 button.addActionListener(this);

上記の行では、ボタンはサブジェクトであり、これはリスナー/オブザーバーです。JButton は、何らかのイベント (この場合はクリック) がボタンで発生するたびに、メソッド actionPerformed を通じてオブザーバーに通知されるように設計されています。

于 2013-05-03T15:57:21.817 に答える
0

つまり、このコードを呼び出しているクラスはボタン変更のリスナーです。そのボタンは、この特定のクラスで「actionPerformed」を呼び出します。

于 2013-05-03T15:51:37.660 に答える
0

button.addActionListener(this);buttonボタンがクリックされるたびに知りthisたいことを伝えます。それ以降、ボタンがクリックされるたびに、登録されている のリストが調べられ、それぞれのメソッドがActionListener呼び出されます。actionPerformed

于 2013-05-03T15:53:25.077 に答える
0

何のコード

button.addActionListener(this);

this作成したボタンのアクションリスナーになるクラスを(キーワードを使用して)追加します。これが意味することは、アクション (クリックなど) が発生するたびにボタンがクラスを呼び出すということです。これが、メソッドが必要な理由です

public void actionPerformed(ActionEvent event){
   button.setText("I’ve been clicked!");
}

ボタンで呼び出されるので

于 2013-05-03T15:53:44.797 に答える