2009-04-30 6 views
7

私はSwingのコンポーネントにいくつかのイベントを送る必要があるので、ユーザー生成の標準のSwingイベントと同様に処理されます。Swing:イベントを作成してコンポーネントにディスパッチする方法は?

基本的には、マクロレコーダーのようなもので、JEditorPaneのエグゼキュータです。しかし、私は生成されたイベントをより詳細に制御する必要があります。 SO

、私がしたい、私はエディタを持っていると仮定します。

  1. キャプチャすべてに送信されたイベント、およびその時点で、私はディスク上に、リストに保存することができ、またはwhatver ...
  2. これらのイベントを後で再生できるようにする
  3. 理想的な状況は、
    "タイプキーA、選択行、削除選択、カーソルアップ、行開始のようなものを含むコマンドを編集できるようにすることです。 」
+0

質問が不明です。 –

答えて

3

標準のGUIイベントを探している場合、希望するものjava.awt.Robot

独自のイベントを定義する場合は、それらのイベントを受け取る必要があるGUIクラスをサブクラス化する必要がありますより良い、それらのための外部コントローラを作成する)、イベントクラスを定義し、イベントをディスパッチします。 java.beans.EventHandlerを使用してディスパッチしたり、独自のハンドラクラスを作成したり(場合によってはより便利だとわかった)、システムイベントキューにイベントを挿入することができます(クラスを見つけることができません) ...私はそれがツールキットだと思った)。

しかし、私はこれらのどれもしません。あなたが記述するもの(マクロレコーダー)は、一連のアプリケーション固有のアクションメッセージ(コマンドパターンを参照)を生成/供給するコントローラーを使用して実装する必要があります。

+0

私はあなたのコマンドのヒントが好きです。しかし、実際にそれを行う方法について何も見つけることができませんでした。 – Ayman

+0

あなたがしたいことを正確に知らなければ、具体的なアドバイスをするのは難しいです。ただし、JEditorPaneがjavax.swing.text.Documentを使用してコンテンツを管理し、DocumentListenerをアタッチしてこのドキュメントのすべての変更を受け取ることができます。リスナーのイベントをリストに保存すると、そのリストをいつでも再生して変更を適用することができます。 – kdgregory

+0

少なくとも、編集者にマクロを記録して再生するシンプルでプログラマブルな方法が必要です。ドキュメントへの添付に関する問題は、ドキュメントにキャレットの移動が送信されないことです。ですから、GUIコンポーネントが受け取った/処理したイベントに接続する必要があります。アクションは非常に適しているように見えます。私は、(記録するために)送信されたアクションと、記録された/処理されたアクションをコンポーネントに注入する方法を見るための接続方法が必要です。 メニーありがとう。 – Ayman

2

私はあなたがイベントのインスタンスを作成して、所望の成分に

イベントのソースを設定し
java.awt.EventQueue.dispatchEvent(event) 

を呼び出す必要があると考えています。

+1

EventQueue.dispatchEventは保護されたインスタンスメソッドです。現在のイベントキューを取得し、そのメソッドを使用するためにサブクラスをプッシュする必要があります。 –

+0

代わりにpostEvent()はどうですか? –

+0

はい、postEvent()は正しい答えのようです。 –

6

明白なことは、EventQueueを取得し、それにイベントを投稿することです。それはちょうどそのイベントをEDTのターンでディスパッチされるキューに追加するだけです。

java.awt.Toolkit.getDefaultToolkit().getSystemEventQueue().postEvent(event); 

昨日、オペラとサファリが独自のことを行い、信頼できないコードに必要な権限を与えていないと主張した人がいました。

Component.dispatchEventを直接呼び出すことです。

+0

私は 'Component.dispatchEvent'を使用するコードをトレースしていますが、間違いがない場合、実際には現在のスレッドでリスナーが呼び出されますか? EventQueueスレッドでハンドラを呼び出すので、 'postEvent'メソッドが改善されていませんか? – Jeach

+0

あなたは、EDT上のコンポーネントですべてをやっているはずです。 (AWTはスレッドセーフであると主張していますが、そうではありません)。もちろん、私が言及したように、パーミッションがあります。 –

関連する問題