1。イベント処理
実際、イベント処理の名前は、MFCのメッセージ応答メカニズムについて自然に考えられています。私が理解している限り、それらは南オレンジと北部の柑橘類の状況と見なされるべきです。 Javaでのイベント処理の「新しいボトル」は、MFCのメッセージ応答であるべきだと思います。
いわゆる「イベント」は、キーボードキー、マウスのクリックなどの変更です。これは、アクションまたはそれに応じて応答する必要があるために特定の状態を変更します。 Javaのイベントを、ボタン、マウス、キーボード、ウィンドウ、その他のイベントのいくつかのカテゴリに分割できます。
イベント処理モデル
1。継承イベント処理モデル(JDK1.0)
JDK1.0では、イベント処理は継承に基づいています。イベントは最初にコンポーネントに送信され、その後、コンテナレベルに沿って上方に伝播します。コンポーネントによって処理されないイベントは、コンポーネントのコンテナに自動的に伝播し続けます。 - これは、MFCにおける元のイベント応答順序または多型応答メカニズムと一致しているようであり、後で述べたプロキシベースのイベント処理メカニズムはMFCコールバックメカニズムと一致しているようです。
特定の治療方法
Action()MethodまたはhanderEvent()メソッドを呼び出して、プログラムが実行されているときに発生するイベントを取得し、コンポーネントで発生するすべてのイベントがこの方法で処理されます。
2。エージェントベースのイベント処理モデル(JDK1.1)
このモデルでは、イベントはこのイベントを生成するコンポーネントに直接送信されます。
各コンポーネントについて、リスナーと呼ばれる1つ以上のクラスが登録されています。これには、このイベントを受け取って処理するイベントハンドラーが含まれています。
リスナーは、リスナーインターフェイスを実装するクラスです。イベントは、登録されたリスナーにのみ報告されるオブジェクトです。各イベントには、対応するリスナーインターフェイスがあります。
マウスでボタンオブジェクトをクリックすると、ActionEventイベントが送信されます。このActionEventイベントは、AddactionListener()メソッドを使用して登録されたすべてのActionListenerのActionPerformed()メソッドによって受信されます。
エージェントベースのイベント処理モデルの機能①イベントは予期せず処理されません。階層モデルでは、イベントがコンテナに伝播し、予期しないレベルで処理される場合があります。
adapterアダプタークラスを作成および使用して、イベントアクションを分類することができます。
それは、作業をさまざまなカテゴリに分配するのに役立ちます。
このイベント処理モデルの学習に焦点を当てます
3。イベント
イベント処理の3つの要素。
(1)イベントソースイベントソースは、ボタン、ウィンドウ、テキストフィールドなどのイベントのジェネレーターです。
(2)イベントタイプJavaのすべてのイベントはクラスにカプセル化され、これらのイベントクラスはjava.awt.eventパッケージに集中しています。すべてのイベントクラスは、AWTEVENTクラスとメソッド-GetSouce()メソッドを継承します。これは、イベントが発生したオブジェクトを返します。
(3)イベントリスナーでさまざまな種類のイベントが発生した後、イベントリスナーはイベントを受信し、対応するイベント処理方法を呼び出します。すべてのイベントリスナーは、実際にはjava.awt.eventパッケージのインターフェイスであり、java.util.eventlistenerインターフェイスを紹介しています。さまざまなイベントタイプのリスナーには、さまざまな方法があります。
イベントの処理手順aspormプログラムはjava.awt.eventパッケージを追加します:
Import Java.awt.Event;
courly必要なイベントソースオブジェクトのイベントリスナーを登録します。
イベントソースオブジェクト.addxxxlistener(xxxlistener);
compinted対応する方法を実装します。リスナーインターフェイスに複数のメソッドが含まれている場合、すべてのメソッドの例を実装する必要があります:b2.addactionlistener(this)
4。イベントアダプター(アダプター)
各リスナーインターフェイスのすべてのメソッドを実装するワークロードは非常に高いです。便利なため、Java言語は、複数の方法を含むクラスを実装するためのアダプタークラスを提供します。
定義するリスナーは、アダプタークラスを継承し、必要なメソッドをオーバーライドできます。
たとえば、ウィンドウイベントに対応するリスナーはWindowListenerであり、Windowoped()、WindowClosed()、WindowClosing()、WindowConfied()、WindowDeiconFied()、WindowDeactivated()を含む複数のメソッドを実装する必要があります。
WindowAdapterを継承する場合、1つまたは複数のメソッドを実装する必要があり、すべてのメソッドを実装する必要はありません。次の例の多くは、ウィンドウを閉じるときにシステムを終了する目的で、ウィンドウクロージ()の1つの方法のみを実装しています。
4.1ボタンイベントの処理
ボタンをクリックするときに発生するイベントはアクションイベントです。アクションイベントに対応するイベントクラスは、ActionEventクラスです。アクションイベントに対応するイベントリスナーは次のとおりです。
リスナーの主な方法:
ActionPerformed(ActionEvent E)アクションイベントが発生したときに呼び出される操作プロジェクト:
最初のステップは、アクションイベントリスナーAddactionListener(ActionListener)を登録することです。
2番目のステップは、ActionListenerインターフェイス方法を実装することです。
4.2マウスイベントの取り扱い
マウスイベントをトリガーするイベントソースは通常、コンテナです。マウスが容器に入ったり、離れたりするか、マウスをクリックしてマウスをドラッグします。容器内では、マウスイベントが発生します。マウスイベントに対応するイベントクラスは、MouseEventクラスです。
MouseEventクラスの方法:
getX()は、マウスのx座標を取得します
gety()は、マウスのy座標を取得します
getpoint()はマウスの位置を取得し、マウスイベントは2つのイベントリスナーに対応します。MouseListener(またはMouseadapter)はマウスイベントに対応し、MousemotionListener(またはMousemotionAdapter)はマウスの動きイベントに対応します。
Mouselistener(またはMouseadapter)の主な方法
マウスプレーニング(MouseEvent E)マウスプレスを処理する方法
MouseReleased(MouseEvent E)マウスのリリースを処理する方法
Mouseentered(MouseEvent e)入力時にマウスを処理する方法
MouseExited(MouseEvent e)出発時にマウスを処理する方法
MouseClicked(MouseEvent E)マウスのクリックを処理する方法
MousemotionListener(またはMousemotionAdapter)の主な方法
Mousemoved(MouseEvent E)移動時にマウスを処理する方法
ムーズ装着(MouseEvent E)マウスのドラッグを処理する方法
4.3キーボードイベントの取り扱い
キーボードフォーカスのあるコンポーネントでキーボードを押したりリリースしたりすると、キーボードイベントが発生します。キーボードイベントに対応するイベントクラスはKeyEventクラスです
KeyEventクラスの主な方法:
getKeycode()を押したりリリースしたりするキーコードを取得します
getKeyText()キーの文字列が押されたりリリースされたりします。キーボードイベントに対応するイベントリスナーは次のとおりです。KeyListenerまたはKeyAdapter
主な方法:
キーボードを押す際の処理方法(KeyEvent E)
KeyReleased(KeyEvent e)キーボードをリリースするときに処理する方法
4.4ウィンドウイベントの処理
ウィンドウとその拡張クラス(フレーム、ダイアログ)がある場合のみ、ウィンドウイベントをトリガーでき、ウィンドウがアクティブ/無効な状態、アイコン/非アイコン状態、またはオープン/クローズ状態などです。
主な方法:
Windowpedened(WindowEvent E)開くウィンドウのイベント処理
WindowClosed(WindowEvent E)閉鎖ウィンドウのイベント処理
WindowClosing(WindowEvent E)ウィンドウの閉鎖イベント処理
Windowactivated(WindowEvent E)アクティベーションステータスのイベント処理
WindowDeactivatedの無効なステータスのイベント処理(WindowEvent e)
4.5他のイベントの取り扱い
4.5.1チェックボックスとラジオボタンのイベント処理のためのイベントクラスはitemEventです。
オプションイベントに対応するイベントリスナーは次のとおりです。
方法:
ItemStateChanged(ItemEvent e)が呼び出されます。オプションイベントが発生した場合4.5.2 Scrollbarイベント処理調整イベントに対応するイベントクラスは、AdactmentEventクラスです。
調整イベントに対応するイベントリスナーは次のとおりです。
方法:
調整イベントが発生したときに、調整ValueChanged(AdactmentEvent E)が呼び出されます
4.5.3ドロップダウンリストのイベント処理イベントクラスは項目Eventです。
オプションイベントに対応するイベントリスナーは次のとおりです。
方法:
ItemStateChanged(ItemEvent E)は、ドロップダウンリストでアクションが発生したときに呼び出されます
(ドロップダウンリストのイベント処理は、イベントタイプ、イベントリスナー、メソッドと同じであることがわかります。
4.5.4メニューイベントの処理メニューイベントは、通常、メニュー項目をクリックすると発生するイベントです。
メニュー項目には2つのタイプがあります。
Menuitemアクションイベント
Checkboxmenuitem、オプションイベント
Menuitemのイベント処理の最初のステップは、すべてのMenuitemメニュー項目のアクションイベントリスナーAddactionListener(ActionListener)を登録することです。
2番目のステップは、ActionListenerインターフェイスの方法を実装することです:ActionPerformed(ActionEvent E)。この方法では、e.getSource()を使用して、ユーザーが選択したメニュー項目を取得し、対応する処理を実行します。
CheckboxMenuitemのイベント処理の最初のステップは、すべてのCheckMenuitemメニュー項目のオプションイベントリスナーをAddItemListener(ItemListener)に登録することです。
2番目のステップは、ItemListenerインターフェイス方法を実装することです。ItemStateChanged(ItemEvent E)。この方法では、e.getSource()を使用して、ユーザーが選択したメニュー項目、e.getitem()を取得して、ユーザーが選択したメニュー項目のラベルを取得し、e.getStateChange()を取得して、選択して対応する処理を実行します。
2。例外処理
優れたプログラミング言語やプログラマーは、例外の処理を無視しません。人気のあるオブジェクト指向のプログラミング言語であるJavaとして、例外処理メカニズムは当然、その重要な機能の1つです。
一般的に言えば、例外は次のように説明されています:プログラミングのエラー。ただし、実際には、このエラーは非常に頻繁に発生し、次のようなさまざまな種類があります。操作エラー(具体的には、システムの操作エラーと論理操作エラーに分けられます。以前のプログラミングエラーと見なされるシステム操作エラーはめったにありません。)
Javaでは、例外は、スロー可能なクラスから継承するクラスです。各例外クラスは実行エラーを表します(注:実行エラーです)。例外クラスには、操作エラーとエラーの処理方法に関する情報が含まれています。
Java例外処理メカニズム:
Javaプログラム操作中に識別可能な実行エラーが発生した場合(つまり、エラーがそれに対応する例外クラスがある場合)、システムは例外クラスの対応するオブジェクトを生成します(注:例外クラスオブジェクトの生成と呼ばれます。)、つまり、例外が生成されます。
例外オブジェクトが生成されると、システムに対応するメカニズムがあり、クラッシュ、デッドループ、またはオペレーティングシステムにその他の損傷がないことを確認し、プログラム全体の操作のセキュリティを確保する必要があります。
例外と例外クラス:
エラー:Java Virtual Machineによって生成およびスローされ、Javaプログラムはそれを処理しません。
ランタイムの例外(0、配列のサブスクリプトが範囲を超えるなどのシステムエラー):システムによって検出され、ユーザーのJavaプログラムは処理できず、システムはデフォルトの例外ハンドラーに渡しました(注:デフォルトの例外処理があります)。
例外(プログラムの問題、予測可能):Javaコンパイラでは、Javaプログラムが、ユーザーが独自の例外を生成するすべての非runtimeの例外をキャッチまたは宣言する必要があります。
例外クラスコンストラクター:
パブリック例外();
パブリック例外(文字列s);文字列パラメーターで渡された情報を受け入れることができます。これは通常、例外に対応するエラーの説明です。
例外クラスはまた、父親が投げられるいくつかの方法を継承します。
1)public string toString();
toString()メソッドは、現在の例外クラス情報を説明する文字列を返します。
2)public void printstacktrace();
printstacktrace()メソッドには返品値がありません。その機能は、印刷操作を完了し、現在の標準出力(通常は画面)の現在の例外オブジェクトのスタック使用トラックを印刷することです。つまり、実行するオブジェクトまたはクラスを呼び出すプログラム(例外オブジェクトのメソッドが操作中に生成されます。
システム定義の操作例外
これらのサブクラスの一部は、システムによって事前に定義され、Javaクラスライブラリに含まれており、システム定義の操作例外と呼ばれます。
ユーザー定義の例外
特定のアプリケーションに固有の操作エラーの場合、プログラマーはプログラムの特別なロジックに従って、ユーザープログラムでユーザー定義の例外クラスと例外オブジェクトを作成する必要があります。ユーザー定義の例外は、通常、例外クラスの親クラスとして使用されます。しかし、まだ理解されていない問題があります。システムは、エラーが発生し、認識可能であることをどのようにして知っていますか?対応する例外クラスオブジェクトを生成する方法は?対応する方法を使用して、例外クラスオブジェクトを解く方法をどのように知っていますか?対応する例外を処理する各例外オブジェクトには、1つの例外処理方法しかありませんか? - - - - - - - - 、 - 、、、、、、、、、、、、、 - - 、、、 - 、、、、、、 - 、 - 、、、、、、、、、、、...
ユーザー定義の例外を作成する場合、次のタスクが一般的に必要です。
1)新しい例外クラスを宣言し、例外クラスまたはその他の既存のシステム例外クラスまたはユーザー例外を親クラスとして取得します。
2)新しい例外クラスの属性とメソッドを定義するか、親クラスの属性とメソッドを過負荷して、これらの属性とメソッドがクラスに対応するエラー情報を反映できるようにします。
スローされた例外
Javaプログラムが実行されると識別可能なエラーが発生すると、エラーに対応する例外クラスのオブジェクトが生成されます。このプロセスは、例外スローと呼ばれます。
実際には、対応する例外クラスオブジェクトのインスタンスをスローしています。
例外クラスに応じて、例外をスローするには2つの方法があります。システム自動スローとユーザースロー:
1.システムは自動的に捨てます
システムが定義した操作エラーの例外は、システムによって自動的にスローされます。
2。ユーザースロー
ユーザー定義の例外は、システムによって自動的にスローされることはできませんが、Javaステートメントでユーザーがスローする必要があります。 Javaステートメントでは、スローステートメントを使用して「例外」を明示的にスローします。
return typeメソッド名(パラメーターリスト)形式のスロー例外クラス名のリストをスローしてスローする{
…
例外クラスインスタンスをスローします。 //ここに注意してください...
}
知らせ:
1)一般的に、プログラムで特定の条件が満たされている場合、例外がスローされます。
多くの場合、IFステートメントのIFブランチにスローステートメントを入れます。
if(i> 100)
Thro(new MyException());
2)スローステートメントを含む方法については、次の部分をメソッドヘッダー定義に追加する必要があります。
スローする例外クラス名のリストをスローします。これは主に、この方法を呼び出すための上部の方法に通知し、ランタイム中に投げる可能性のある例外を受け入れて処理する準備をすることです。メソッドに複数のスローステートメントがある場合、メソッドヘッダースローにすべての可能な例外をリストする必要があります。
3)Java言語では、スローで宣言されたすべてのクラスがキーワードで宣言され、スローでスローされたオブジェクトはスロー可能なクラスまたはそのサブクラスでなければなりません。投げられないオブジェクトを投げようとすると、Javaコンパイラはエラーの例外を報告します。
主に例外をキャッチする方法、例外をキャッチした後にジャンプする方法、および例外処理ステートメントを作成する方法を検討してください
1。試してみてください…キャッチ…最後にブロック
1)試してみてください
TRYステートメントの{}には、1つ以上の例外をスローする可能性のあるプログラムコードが含まれています。これらのコードは、実際には、その後のキャッチブロックによってキャッチできる例外の範囲を指定します。
JavaプログラムがTryブロックでステートメントに到達したときに例外が発生した場合、Tryブロックで他のステートメントを実行し続けることはなくなりますが、Catchブロックを直接入力して最初の一致する例外タイプを見つけて処理します。
2)キャッチブロック
Catchステートメントのパラメーターは、例外タイプと例外オブジェクトを含むメソッドの定義に似ています。
例外タイプは、キャッチステートメントで処理される例外タイプを指定するスロー可能なクラスのサブクラスである必要があります。
例外オブジェクトは、TRYによって指定されたプログラムコードブロックにJavaランタイムシステムによってスローされた巻き毛装具の例外オブジェクトを処理するためのメソッドコードです。
異なるタイプの例外を個別に処理する複数のキャッチステートメントがあります。
Javaランタイムシステムは、それが一致するCatchステートメントが見つかるまで、上から下への各キャッチステートメントで処理された例外タイプを検出します。
ここで、タイプマッチングとは、キャッチの例外タイプが、生成された例外オブジェクトのタイプまたは例外オブジェクトの親クラスとまったく同じであることを意味します。したがって、Catchステートメントの並べ替え順序は、特別から一般的なものでなければなりません。 (なぜ考えてみてください?)
3)最後にブロックします
最終的なステートメントは、例外処理イベントのために提供されるクリーンアップメカニズムであると言えます。通常、ファイルを閉じたり、他のシステムリソースをリリースしたりするために使用されます。 Try-Catch-Finally Statementには、最終的な部分があるステートメントがある場合があります。
最終的に部分がない場合、Tryによって指定されたプログラムコードが例外をスローする場合、他のプログラムコードは実行されません。
最終的な部分がある場合、Tryブロックで例外が発生しても、キャッチパーツが実行されたかどうかに関係なく、最終的なパートステートメントを実行する必要があります。
ステートメントの最終的な一部は、例外処理のための統一された出口を提供することがわかります。
複数の例外は複数の異なる例外を生成する可能性があります。これらの例外に対処するために異なる方法を使用する場合は、マルチ例外処理メカニズムを使用する必要があります。
TRYブロックの後に複数のキャッチブロックを定義することにより、複数の例外処理が達成されます。各キャッチブロックは、特定の例外オブジェクトを受信して処理するために使用されます。キャッチブロックのパラメーターを介して、例外オブジェクトがこのキャッチブロックによって受信および処理される例外であるかどうかを決定します。
どのキャッチブロックが取得されますか?例外オブジェクトとキャッチブロックの例外パラメーターの一致に応じて、次の3つの条件のいずれかを満たしている場合、例外オブジェクトとパラメーターは一致すると見なされます。
1)例外オブジェクトは、パラメーターと同じ例外クラスに属します。
2)例外オブジェクトは、パラメーター例外クラスのサブクラスに属します。
3)例外オブジェクトは、パラメーターによって定義されたインターフェイスを実装します。
Tryブロックによって生成された例外オブジェクトが最初のCatchブロックによって受信された場合、プログラムのフローはこのCatchステートメントブロックに直接ジャンプします。ステートメントブロックが実行されると、現在の方法が終了します。 Tryブロックやその他のキャッチブロックで実行されていないステートメントは無視されます。 TRYブロックによって生成された例外オブジェクトが最初のキャッチブロックと一致しない場合、システムはマッチングのために2番目のキャッチブロックに自動的に移動します。 2番目のものがまだ一致しない場合、それは3番目、4番目に変わります...例外オブジェクトを受信できるキャッチブロックが見つかり、プロセスが完了するまで。
Tryブロックによって生成された例外オブジェクトが最初のCatchブロックによって受信された場合、プログラムのフローはこのCatchステートメントブロックに直接ジャンプします。ステートメントブロックが実行されると、現在の方法が終了します。 Tryブロックやその他のキャッチブロックで実行されていないステートメントは無視されます。 TRYブロックによって生成された例外オブジェクトが最初のキャッチブロックと一致しない場合、システムはマッチングのために2番目のキャッチブロックに自動的に移動します。 2番目のものがまだ一致しない場合、それは3番目、4番目に変わります...例外オブジェクトを受信できるキャッチブロックが見つかり、プロセスが完了するまで。
Tryブロック内のすべてのステートメントの実行が例外を提起しない場合、すべてのキャッチブロックは無視され、実行されません。
知らせ:
1)CATCHブロックのステートメントは、異なる例外に応じて異なる操作を実行する必要があるため、複数の例外を扱う場合は、各キャッチブロックの配置順序を慎重に設計するために注意する必要があります。一般に、より具体的で一般的な例外を扱うキャッチブロックは前に配置する必要がありますが、複数の例外に一致するキャッチブロックを背面に配置する必要があります。
/*ユーザーを試して、エラー例外処理を実行してください:問題はこれです。入力されたユーザーの給与の初期値が800未満の場合、間違っています。もちろん、給与の変更が20%を超える場合、それも間違っています*/ Import java.awt。*; Java.Applet。*; java.awt.event。*;パブリッククラスのuserexceptionappletは、Actionlistener {label prompt1 = new Label( "従業員の名前と給与の初期値を入力してください:");ラベルprompt2 = new Label( "修正する給与を入力してください");テキストフィールド名、isal、nsal;文字列msg;従業員EMP;ボタンokbtn = newボタン( "ok");ボタンcancelbtn = new Button( "Cancel"); public void init(){name = new Textfield(5); isal = new Textfield(5); nsal = new Textfield(5); add(prompt1); add(name); add(isal); add(prompt2); add(nsal); add(okbtn); OKBTN.ADDACTIONLISTENER(this); cancelbtn.addactionlistener(this); add(cancelbtn); } public void paint(グラフィックスG){g.drawstring(msg、0,80); } public void createEmp(string empname、double sa){try {emp = new Employee(empname、sa); msg = new String(Emp.ToString()); } catch(IllegalsalAryException is){msg = new String(ise.toString()); }} public void changeempsal(double changiesal){try {emp.setempsalary(changesal); msg = new String(Emp.ToString()); } catch(IllegalsalAryException Illsal){msg = new String(illsal.tostring()); } catch(IllegalsalAryChangeException IllSalChange){MSG = new String(emp.toString()+IllSalChange.ToString()); }} public void ActionPerformed(actionEvent e){string empname;二重紋章、変化;オブジェクトobj = e.getSource(); if(obj == okbtn){empname = new String(name.getText()); if(empname == null){msg = new String( "従業員の名前と給与を最初に入力して作成してください"); } if(nsal.getText()== null){empsal = double.valueof(isal.getText())。doubleValue(); CreateEmp(Empname、Empsal); } else {changesSal = double.valueof(nsal.getText())。doubleValue(); ChangeEmpsal(変化); }} if(obj == cancelbtn){naem.settext( ""); isal.settext( ""); nsal.settext( ""); } Repaint(); }} class Employee {string m_empname; double m_empsalary;従業員(文字列名、ダブルイニシャル)は、違法なexceptionをスローします{m_empname = name; //ここに問題があるかどうかを確認してください、参照コードはm_empname = new String(name); if(initsalary <800){shrow(new IllegalsalaryException(this、initsalary)); // throwステートメント} m_empsalary = initsalary; } public string getempname(){return m_empname; } public double getempsalary(){return m_empsalary; } public boolean setempsalary(double newsal)は、違法行為、違法な視点をスローします。 else if(getempsalary()== 0.0){m_empsalary = newsal; trueを返します。 } else if(math.abs(newsal-getempsalary())/getempsalary()> = 0.2)スロー(新しい違法salrychangeexception(this、newsal-getempsalary()); else {m_empsalary = newsal; trueを返します。 }} public string toString(){string s; s = "name:"+m_empname+"給与:"+m_empsalary; s; }} class IllegalsalAryExceptionは例外を拡張します{private Employee m_concernedemp;プライベートダブルM_ILLEGALSALARY; IllegalsalAryException(従業員EMP、二重ISAL){super( "賃金は最低賃金よりも低い"); M_CONCERNEDEMP = EMP; M_ILLEGALSALARY = ISAL; } public string toString(){string s; S = "従業員に提供される賃金は違法です:従業員:"+M_CONCERNEDEMP.GETEMPNAME()+"違法給与:"+M_ILLEGALSALARY+"RMB 800の最低賃金額よりも低い。 s; }} class IllegalsAryChangeExceptionは例外を拡張します{private Employee m_concernedemp;プライベートダブルM_ILLEGALSALARYCHANGE; IllegalsAlryChangeException(従業員Emp、double csal){super( "給与の変化は大きすぎる"); M_CONCERNEDEMP = EMP; m_illegalsalarychange = csal; } public string toString(){string s; s = "従業員に提供される賃金の変更は違法です:従業員:"+m_concernedemp.getempname()+"賃金変化の違法な変更:"+m_illegalsalarychange+"元の給与より20%高い"。 s; }}