4

私が理解に苦しんでいるのは、次のような方法がどれほど正確かということです

    public interface MouseListener extends EventListener {

        public void mouseClicked(MouseEvent e) {
             //code for what happens when you click the mouse on the component
        }
    }

マウスイベントのIDを知っています。イベントが実行されたときにイベントが mouseClicked メソッドにのみ送信されるのはなぜですか? これらのメソッドのコンストラクターは、可能なマウス イベントのいずれかを呼び出すため、他のメソッドが同じコンストラクター (つまり、mousePressed、mouseReleased など) を持っている場合にのみ、mouseClicked メソッドにのみ送信されるのはなぜですか?

4

3 に答える 3

3

このようなインターフェイスは、実装してオブジェクトを作成し、そのオブジェクトをイベント ソースに登録すると便利になります。ここで登録の部分が重要です。マウス クリック イベントに登録すると、オブジェクトはそれを受け取ります。

基本的に、これらのインターフェイスは同様のイベントを処理するために使用されるため、似ていますが、最終的には、登録したイベントについてのみ通知されます。ここには魔法はありません。イベント ソースは、何らかのイベントに関心のあるリスナーのコレクションを内部的に保持し、そのようなイベントが発生すると、コレクションを反復処理してリスナー メソッドを呼び出します。

たとえば、あなたが言及したマウス リスナー インターフェイスには、いくつかのメソッドがあります。

public interface MouseListener extends EventListener {
    public void mouseClicked(MouseEvent e);
    public void mousePressed(MouseEvent e);
    ...
}

クラスの一部を見るjava.awt.Componentと、正しいメソッドを呼び出すイベント ソースであることがわかります。

public abstract class Component implements ImageObserver, MenuContainer,
                                       Serializable
{
...
    protected void processMouseEvent(MouseEvent e) {
        MouseListener listener = mouseListener;
        if (listener != null) {
            int id = e.getID();
            switch(id) {
              case MouseEvent.MOUSE_PRESSED:
                  listener.mousePressed(e); // invoking a specific listener's method
                  break;
              case MouseEvent.MOUSE_RELEASED:
                  listener.mouseReleased(e);
                  break;
              ...


}
于 2013-05-13T20:11:00.847 に答える