ホームページ >よくある問題 >オブジェクトはどのような動作を認識し、応答できるのでしょうか?

オブジェクトはどのような動作を認識し、応答できるのでしょうか?

青灯夜游
青灯夜游オリジナル
2020-08-29 11:32:594721ブラウズ

オブジェクトが認識して応答できる動作は「イベント」です。オブジェクトが認識して応答できる動作はイベントと呼ばれます。イベントとは、オブジェクトが認識および検出できるアクションです。このアクションがオブジェクトで発生すると、対応するイベントがトリガーされます。

オブジェクトはどのような動作を認識し、応答できるのでしょうか?

#Java イベントの概要

イベント処理モデル

GUI アプリケーションの場合、イベント処理は不可欠であるため、イベント処理モデルを十分に習得する必要があります。イベントについては、イベント ソース オブジェクトとリスナー オブジェクトという 2 つの用語を理解する必要があります。文字通りの意味から大まかなアイデアは得られるので、以下のシステムを説明しましょう:

    リスナー オブジェクトは、特定のリスナー インターフェイスを実装するクラスのインスタンスです。
  • イベント ソースは、リスナー オブジェクトを登録し、イベント オブジェクトを送信できるオブジェクトです。
  • イベントが発生すると、イベント ソースはイベント オブジェクトをすべての登録に渡します。
  • #リスナー オブジェクトは、イベント オブジェクト内の情報を使用して、イベントへの応答方法を決定します。
  • 最初に、リスナー オブジェクトを登録します。イベント ソース オブジェクトを使用して、イベントがトリガーされたときに、システムがイベント ソースを通じて対応するリスナーにアクセスできるようにします。以下に示すように:

#イベント ソースがイベントをトリガーすると、システムはイベントの関連情報を対応するタイプのイベント オブジェクトにカプセル化し、それをイベントソースに登録されたイベントソース 対応するリスナー。以下に示すように: オブジェクトはどのような動作を認識し、応答できるのでしょうか?

#イベント オブジェクトがリスナーに送信されると、システムはリスナーの対応するイベント処理メソッドを呼び出してイベントを処理します。応答する。以下に示すように: オブジェクトはどのような動作を認識し、応答できるのでしょうか?

#注: リスナーとイベント ソースの間には「多対多」の関係があります。 オブジェクトはどのような動作を認識し、応答できるのでしょうか?

イベント オブジェクトの階層

イベント オブジェクトの最上位レベルは java.util.EventObject で、すべてのイベント ステータス オブジェクトの派生元となるルート クラスです。 Object クラスから継承されたクラスに加えて、このクラスには getSource() メソッドもあります。このメソッドの機能は、イベントが最初に発生したオブジェクトを返すことです。

このクラスが util パッケージ内にあることを除き、他のクラスは java.awt、java.awt.event パッケージまたは java.swing、java.swing.event パッケージ内にあります。 Swing コントロールを意味します。Swing イベントのみを使用します。

AWTEvent クラスは、イベントの性質の識別子を返す getID() メソッドを提供します。たとえば、マウス イベントが発生した場合、それがクリック、ドラッグ、プレス、またはその他の操作であったかどうかを確認できます。

一般的に使用されるいくつかのイベント クラスの説明:

EventObject: すべてのイベント クラスのスーパー クラス。最も重要なメソッド getSource() は、イベント
  • AWTEvent を生成したオブジェクトを返します。これは、すべての AWT イベント クラスのスーパークラスです。最も重要なメソッド - getID() は、イベントの ID 番号を返します。イベント ID は、ボタン イベントやマウス クリック イベントなどのイベントのタイプを指定する整数です。 ##ActionEvent : コンポーネントがアクティブ化されたときに発生するイベント
  • AdjustmentEvent: 調整可能なコンポーネント (スクロール バーの移動など) が調整されたときに発生するイベント
  • ComponentEvent: コンポーネントを操作するときに発生する高レベルのイベント
  • ##ContainerEvent: コンポーネントがコンテナに追加またはコンテナから削除されるときに発生します

  • #InputEvent: 入力デバイスによって生成される高レベルのイベント

  • ##ItemEvent: 選択項目、チェック ボックス、またはリストから選択すると発生します
  • ##KeyEvent: キーボード操作時に発生
  • MouseEvent: マウス操作時に発生
  • ##PaintEvent: 描画時にイベント発生コンポーネント

  • TextEvent: テキストが変更されたときに発生します

  • WindowEvent: 最大化または最小化など、ウィンドウが操作されたときにイベントが発生しますウィンドウ。

  • リスナー オブジェクトの階層
  • リスナー オブジェクトは、特定のリスナー インターフェイスを実装するクラスのインスタンスであり、その後、リスナー インターフェイスが実装されます。私たちが心配していること。リスナー インターフェイスの最上位インターフェイスは java.util.EventListener であり、このインターフェイスはすべてのイベント リスナー インターフェイスが拡張する必要があるマーク インターフェイスです。驚くべきことに、このインターフェイスは完全に空であり、抽象メソッドの定義はありません。ソース コードを確認すると、空です。

  • イベント リスナー クラス (リスナー オブジェクトが属するクラス) は、イベント リスナー インターフェイスを実装するか、イベント リスナー アダプター クラスを継承する必要があります。

イベント リスナー インターフェイスは、イベントを処理するために実装する必要があるメソッドを定義します。

イベント リスナー アダプター クラスは、イベント リスナー インターフェイスの単純な実装です。目的はプログラミングの負担を軽減することです。

イベント リスナー インターフェイスの命名方法は XXListener です。Java では、これらのインターフェイスはすでに定義されています。実装するには、イベント ハンドラー (つまり、イベント処理メソッドのプロトタイプ。このメソッドは再実装する必要があります) を定義します。

例: ActionListener インターフェイス、MouseListener インターフェイス、WindowListener インターフェイス、KeyListener インターフェイス、ItemListener インターフェイス、MouseMotionListener インターフェイス、FocusListener インターフェイス、ComponentListener インターフェイスなど。

イベント ソース

イベントは最初にイベント ソースによって生成されます。イベント ソースは、GUI コンポーネント Java Bean またはイベントを生成できるオブジェクトにすることができます。GUI コンポーネントの場合、イベント ソースまたはコンポーネントのピア ( Abstract Window Toolkit [awt] GUI コンポーネントの場合)、またはコンポーネント自体 (Swing コンポーネントの場合)。

Javaでは、各コンポーネントがどのようなイベントを生成するかが定義されています。言い換えれば、どのようなイベントでも、どのコンポーネントがそれを生成できるかはすでに決定されています。

イベント

AWT は、イベントを低レベル イベントとセマンティック イベントに分割します。

  • セマンティック イベントは、ユーザーのアクションを表すイベントです。

  • 低レベル イベントは、それらのイベントを形成するイベントです。

java.awt.event パッケージ内の共通のセマンティック イベント クラス:

  • ActionEvent (ボタンのクリック、メニュー選択、選択リスト項目に対応)またはテキスト ボックスに Enter キーを押します)

  • AdjustmentEvent (ユーザーがスクロール バーを調整します)

  • ItemEvent (ユーザーがチェックから項目を選択します)ボックスまたはリスト ボックス 項目)

一般的に使用される 5 つの低レベル イベント クラス:

  • KeyEvent (キーが押されるか離される)

  • MouseEvent (マウス ボタンが押される、離される、移動またはドラッグされる)

  • MouseWheelEvent (マウス ホイールが回転する)

  • FocusEvent (コンポーネントがフォーカスを取得または失う)

  • WindowEvent (ウィンドウの状態が変更される)

java.awt.eventパッケージ で定義されている一般的に使用されるイベント アダプター クラスには、次のものがあります。

1. ComponentAdapter(コンポーネントアダプター)

# 2. ContainerAdapter(コンテナアダプター)

3. FocusAdapter(フォーカスアダプター)

4. KeyAdapter(キーボードアダプター)

5. MouseAdapter(マウスアダプター)

6. MouseMotionAdapter(マウスモーションアダプター)

7. WindowAdapter(ウィンドウアダプター)

イベントソースとリスナーの対応関係

実際のJava開発における対応関係図は次の図です:

オブジェクトはどのような動作を認識し、応答できるのでしょうか?

共通イベント オブジェクトとリスナー インターフェイスの比較表:

オブジェクトはどのような動作を認識し、応答できるのでしょうか?

#共通イベント ソースとリスナー インターフェイスの比較表#リスナー インターフェイスイベント ソース##ActionListenerAbstractButton JcomboBox TimerJscrollBarAbstractButton JComboBoxComponent##KeyListenerComponentMouseListenerコンポーネントMouseMotionListenerコンポーネントMouseWheelListenerコンポーネントWindowListenerWindowWindowFocusListenerWindowWindowStateListenerウィンドウ

提案: この部分を理解するには、まず Java ビジュアル コンポーネントとコンテナーの間の一般的な関係を理解する必要があります。これにより、理解が容易になります。

通常のプログラム開発手順

プログラム開発者としてしなければならないことは、イベント リスナー オブジェクトを作成し、イベントがアクティブ化されるコンポーネントにそれを配置することです。 (新規) 登録します。いわゆるイベントリスナーオブジェクトの作成はクラスを作成することを意味し、このクラスは XXListener の形式でインターフェースを実装する必要があります (または「XXListener を実装したクラス」を継承する)。 もちろん、このインターフェースの実装はメソッドをオーバーライドすることを意味しますXXListenerの。

たとえば、ActionListener の場合、actionPerformed メソッドは 1 つだけです:

class B1 implements ActionListener{// 实现ActionListener
    @override
    public void actionPerformed(ActionEvent e){
	//重写actionPerformed     
        //do somthing....
    }
}

アクティブ化されたイベントのコンポーネントにイベント リスナーを登録します。つまり、addXXListener() 形式のメソッドを呼び出します。 。

例:

Button b1 = new Button("Button 1");
b1.addActionListener(new B1()); //注册事件监听器

b1 は起動されたイベントのコンポーネント このように、イベントが起動されたときの処理の流れは次のようになります。 addActionListener なので、特定のイベント処理メソッド、つまり actionPerformed() 関数が呼び出されます。このように、実行結果は、actionPerformed が具体的に何を行うかによって異なります。

リスナーは特定のイベント ソースのみをリッスンするため、匿名オブジェクトを使用してリスナーを登録できます。

例:

JButton b=new JButton("jjjj");
b.addActionListener(new ActionListener() {
	@Override
	public void actionPerformed(ActionEvent e) {
		//重写actionPerformed     
        //do somthing....
	}
});

Java Swing で各コンポーネント イベントを処理する一般的な手順は次のとおりです:
1. 新しいコンポーネント (JButton など) を作成します。
2. コンポーネントを対応するパネル(JPanelなど)に追加します。
3. イベントソースによって生成されたイベント(ActionListenerを介したユーザーのボタンクリックへの応答など)をリッスンするためのリスナーを登録します。
4. イベントを処理するメソッドを定義します(ActionListenerのactionPerformedに対応するメソッドを定義するなど)。

上記のリスナー クラスを作成する最初の方法は内部クラスにすることができ、リスナーを作成する 2 番目の方法は匿名の内部クラスであり、これは理解しやすいです。

レスポンスとインターフェースの分離設計

イベント処理とインターフェースを一緒に書くのですが、一方はメンテナンスが不便で、もう一方は現在のコードファイルが肥大化します。したがって、対応するイベントをインターフェイスから分離することをお勧めします。これにより、最初の 2 つの欠陥が補われるだけでなく、コードの再利用性も向上します。ただし、内部クラスと匿名内部クラスの使用を無視しないでください。それぞれに利点と欠点があり、それらを総合的に考慮する必要があります。

Swing パッケージは、コマンドをカプセル化し、それらを複数のイベント ソース (アクション インターフェイス) に接続するための非常に実用的なメカニズムを提供します。アクションは、次の内容をカプセル化するオブジェクトです。

  • コマンドの説明 (テキスト文字列とオプションのアイコン)

  • コマンドの実行必須パラメータ (例: リストされている例で変更が要求されている色)

詳細については API を参照してください。

Action はクラスではなくインターフェースであることに注意してください。このインターフェイスを実装するすべてのクラスは、7 つのメソッドを実装する必要があります。幸いなことに、actionPerformed メソッドを除くこのインターフェイスのすべてのメソッドを実装するクラス (AbstractAction) が存在します。このクラスは、すべての名前と値のペアを保存し、プロパティ変更リスナーを管理します。 AbstractAction クラスを直接拡張し、拡張されたクラスに actionPerformed メソッドを実装できます。

私が見たより良い設計方法は、リスナー クラスが javax.swing.AbstractAction を継承し、コンポーネントの登録時にコンポーネントがリスナーに渡されることです。

リスナー:

public class AC_temp extends AbstractAction{
	private static final long serialVersionUID = 1L;
	MainFrame main;
	public AC_EditVideoInfo(MainFrame temp,Color color) {
		main=temp;
		putValue(Action.NAME, "name");
		putValue(Action.SMALL_ICON, new ImageIcon("images/edit.png"));
		putValue(Action.SHORT_DESCRIPTION, "description");
                putValue("color",color);
                //....
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// do something
	}
}

イベント ソース:

组件.addActionListener(new AC_EditVideoInfo(this));//注册监听器

メソッド呼び出しを含むリスナーを作成します

java.beans.EventHandlerは、ネーミングの観点から見たイベント マネージャーです。公式 API による説明は次のとおりです: EventHandler クラスは、動的に生成されるイベント リスナーのサポートを提供し、これらのリスナーのメソッドは、受信イベント オブジェクトとターゲット オブジェクトを含む単純なステートメントを実行します。

詳細な説明については、次を参照してください:————————>>>>>>>>>

使用例EventHandler:

EventHandler を使用する最も簡単な方法は、リスナーをインストールし、パラメーターなしでターゲット オブジェクトのメソッドを呼び出すことです。次の例では、javax.swing.JFrame インスタンスの toFront メソッドを呼び出す ActionListener が作成されます。

myButton.addActionListener(
    (ActionListener)EventHandler.create(ActionListener.class, frame, "toFront"));

myButton が押されると、frame.toFront() ステートメントが実行されます。 ActionListener インターフェイスの新しい実装を定義し、そのインスタンスをボタンに追加することで、ユーザーはコンパイル時の型安全性が追加され、同じ効果を達成できます。

//Equivalent code using an inner class instead of EventHandler.
myButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        frame.toFront();
    }
});

EventHandler のもう 1 つの最も簡単な使用法は、リスナーからのものです。リスナー インターフェイス (通常はイベント オブジェクト) のメソッドの最初のパラメーターからプロパティ値を抽出し、それを使用してターゲット オブジェクトにプロパティ値を設定します。次の例では、ターゲット (myButton) オブジェクトの nextFocusableComponent プロパティをイベントの「source」プロパティの値に設定する ActionListener が作成されます。

EventHandler.create(ActionListener.class, myButton, "nextFocusableComponent", "source")

これは、次の内部クラス実装に対応します:

//Equivalent code using an inner class instead of EventHandler.
new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        myButton.setNextFocusableComponent((Component)e.getSource()); 
    }
}

受信イベント オブジェクトをターゲット アクションに渡すだけの EventHandler を作成することも可能です。 EventHandler.create の 4 番目のパラメーターが空の文字列の場合、イベントは次のように配信されます:

EventHandler.create(ActionListener.class, target, "doActionEvent", "")

これは、次の内部クラス実装に対応します:

//Equivalent code using an inner class instead of EventHandler.
new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        target.doActionEvent(e);
    }
}

EventHandler 最常见的用法可能是从事件对象的 source 中提取属性值,并将此值设置为目标对象的属性值。在以下示例中,将创建一个 ActionListener,它将目标对象的 "label" 属性设置为事件源的 "text" 属性的值("source" 属性的值)。

EventHandler.create(ActionListener.class, myButton, "label", "source.text")

这将对应于以下内部类实现:

//Equivalent code using an inner class instead of EventHandler.
new ActionListener {
    public void actionPerformed(ActionEvent e) {
        myButton.setLabel(((JTextField)e.getSource()).getText()); 
    }
}

可以使用以 "." 字符分隔的任意数量的属性前缀来“限定”事件属性。采用出现在 "." 字符前面的“限定”名称作为将应用于事件对象的属性名称,最左边的最先应用。
例如,以下动作侦听器

EventHandler.create(ActionListener.class, target, "a", "b.c.d")

可以写成以下内部类(假定所有属性都有规范的获取方法并返回适当的类型):

//Equivalent code using an inner class instead of EventHandler.
new ActionListener {
    public void actionPerformed(ActionEvent e) {
        target.setA(e.getB().getC().isD()); 
    }
}

也可以使用以 "." 字符分隔的任意数量的属性前缀来“限定”目标属性。例如,以下动作侦听器:

EventHandler.create(ActionListener.class, target, "a.b", "c.d")

可以写成以下内部类(假定所有属性都有规范的获取方法并返回适当的类型):

//Equivalent code using an inner class instead of EventHandler.
   new ActionListener {
     public void actionPerformed(ActionEvent e) {
         target.getA().setB(e.getC().isD()); 
    }
}

由于 EventHandler 最终依赖反射来调用方法,所以建议不要以重载方法为目标。例如,如果目标是类 MyTarget 的一个实例,而 MyTarget 定义如下:

public class MyTarget {
     public void doIt(String);
     public void doIt(Object);
   }

那么方法 doIt 被重载。EventHandler 将基于源调用恰当的方法。如果源为 null,那么两个方法都可以,具体调用哪个方法是不确定的。因此,建议不要以重载方法为目标。

更多相关知识,请访问:PHP中文网

JTextField


AdjustmentListener
ItemListener

FocusListener

以上がオブジェクトはどのような動作を認識し、応答できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。