0

私は JWindow と JFrame を両方とも実行可能にし、両方ともマウスリスナーを実装しています。私は自分のプロジェクトのために多くのテストを行う必要があり、それを簡素化するために、そのほとんどを自動化できるようにしたいと考えているため、独自のマウスレコーダーとリプレーヤー (Java Robot クラスを使用) を開始しました。

単純化された AutoHotKey や AutoIt のようなものですが、Windows マシンだけでなく、Ubuntu マシンでも動作します!!!

私が作成した JWindow は半透明で、画面全体をカバーします。クリックすると消え、背後のオブジェクトへのクリックが再生されてから再び表示されます。これが録音プロセスです。ユーザーが右クリックすると、非表示に設定され、記録されたアクションが再生されます。

再生中にアプリケーション全体を終了できるオプションが必要なので、これを行う最善の方法は、JFrame と JWindow を実行可能にすることです。

JFrame は、アプリケーションからクローズ オプションを提供するためのものです。

だから、私のメインクラスでは

public static void Main(String[] args){
    recorder = new Recorder();
    gui = new GUI();
    Thread tr = new Thread(recorder);
    Thread tg = new Thread(gui);
    tr.setName("Recorder");
    tg.setName("GUI");
    tr.start();
    tg.start();
}

私の理解では、Recorder と GUI は実行可能なオブジェクトであり、新しい Thread コマンドによってスレッド化されます。.start() を使用すると、スレッドの実行が開始され、ここから、特定の時間にどのスレッドが実行されているかがシステムによって決定されます。

Recorder クラスと GUI クラスに。

public class Recorder
        implements Runnable, MouseListener {

//Constructor and other code

    public void mouseClicked(MouseEvent e) {

        if (e.getButton() == MouseEvent.BUTTON1) {
             //Record events
        }else{
             //Replay events
        }
        System.exit(0);
    }

    public void run() {
        System.out.println("Recorder");
    }
}

public class GUI 
    implements Runnable, MouseListener {

//Constructor, simply constructs JFrame and sets mouselistener to it

   public void mouseClicked(MouseEvent e) {
       System.exit(0);
   }

   public void run() {
        System.out.println("GUI");
   }

}

私のアプリケーションは Recorder を出力し、次に GUI を使用してイベントを記録し、JWindow を右クリックしてそれらを再生できます...

しかし、マウスリスナーのためにJFrameの閉じるボタンをクリックしたり、フレーム内でクリックしたりしても、すべてのアクションが完全に再生されるまで終了しませんか?

私が疑問に思ったことの 1 つは、スレッドを実行し続けるものは何なのかということです。したがって、System.out.println(""); スレッドが死ぬ?だから私はそれらの周りでwhileループを試み、私のアプリケーションは正常に印刷されました

GUI GUI GUI RECORDER RECORDER GUI RECORDER など

したがって、それらのスレッドが同時に実行されていることがわかります...実行外の他のすべてのアクションが実行されないように見えるだけです...マウスリスナーなどをスレッド実行に含めるにはどうすればよいですか?

4

2 に答える 2

1

と混同Threadsしてい Objectsます。スレッドの開始点を与えるだけの がObjectある場合。Runnableただし、これは、別のスレッド (この場合は を処理するイベント スレッド) がを実行しているスレッドによって実行されMouseListenerたメソッドを呼び出したときに、 . メソッドが呼び出されると、別のスレッドに切り替わることはありません。これが必要な場合は、メカニズムが必要です。たとえば、タスクを投稿できるキューで、新しいタスクを探し続けます。RunnableRunnableMouseListenerRunnable.run()

于 2010-03-22T10:44:03.447 に答える
1

swing が初期化されると、独自の Event Dispatch スレッドが開始されます。すべてのリスナー メソッドは、このスレッド内で実行されます。リスナー オブジェクトが runnable を実装するかどうかは問題ではありません。

Swing のコンテキストでマルチスレッドの基本を理解するには、このチュートリアルを参照してください。http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html

あなたの質問に対する実際の答えは、チュートリアルのこの部分にあります。

http://java.sun.com/docs/books/tutorial/uiswing/concurrency/cancel.html

ただし、チュートリアル全体を実行することをお勧めします。

于 2010-03-22T10:44:05.677 に答える