Frage

Ich habe einen JWindow und ein JFrame, das ich für Runnable gemacht habe, und beide implementieren einen Maushörer. Ich habe eine Menge Tests für ein Projekt von mir und um es zu vereinfachen, möchte ich das meiste automatisieren können, also habe ich meinen eigenen Maus -Rekorder und eine Wiederholung (verwendet Java -Roboterklasse).

Ein bisschen wie ein vereinfachtes Autohotkey- oder Autoit -Ding ... aber es läuft auf meinem Ubuntu -Computer so wie meine Fenster !!!

Das von mir hergestellte JWindow ist durchscheinend und deckt den gesamten Bildschirm ab. Wenn Sie darauf klicken, verschwindet er und spiegelt das Klicken auf das Objekt dahinter und erscheint dann wieder auf. Dies ist der Aufnahmeprozess. Wenn der Benutzer mit der rechten Maustaste klickt, wird das auf nicht sichtbare und die aufgezeichneten Aktionen wiedergegeben.

Während der Wiederholung möchte ich die Möglichkeit, die gesamte Anwendung verlassen zu können, und so wäre der beste Weg, dies zu tun, darin, den JFRame und den JWindow -Runnable zu machen.

Der JFRAME ist einfach er, um eine enge Option aus der Anwendung zu bieten.

Also habe ich in meiner Hauptklasse ich

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();
}

Mein Verständnis ist Recorder und GUI sind ausgeführte Objekte und sie werden über den neuen Thread -Befehl zu Threads verarbeitet. Wenn ich .Start () verwende, beginne ich mit der Ausführung des Threads und von hier aus dem System entscheidet ich, welcher Thread zu einem bestimmten Zeitpunkt ausgeführt wird.

Auf den Recorder- und GUI -Klassen.

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");
   }

}

Meine Anwendung druckt Recorder aus und dann ermöglicht GUI, meine Ereignisse aufzunehmen und dann mit der rechten Maustaste auf die JWindow zu klicken, um sie wiederzugeben ...

Aber wenn ich dann auf die Schaltfläche "Schließen des JFrame" oder sogar im Rahmen wegen des Maushörers klicke, wird er erst beendet, wenn alle Aktionen vollständig wiedergegeben wurden?

Eine Sache, die ich mich gefragt habe, ist, was ich immer wieder in den Lauf genommen habe, ist, was den Thread am Laufen hält? Also, wenn system.out.println (""); Wird der Thread ausgeführt? Also habe ich eine Weile versucht, sie um sie herum zu schleifen und meine Anwendung erfolgreich ausdrucke

GUI GUI GUI Recorder Recorder GUI Recorder usw. usw.

Ich kann also sehen, dass sie gleichzeitig laufen ... es ist nur so, dass alle anderen Aktionen außerhalb des Laufs nicht ausgeführt werden ... wie kann ich meinen Maushörer usw. in die Threads -Ausführung einbeziehen?

War es hilfreich?

Lösung

Du bist verwirrend Threads mit Objects. Wenn Sie eine haben Object das ist ein Runnable Das gibt nur einen Ausgangspunkt für einen Thread. Dies bedeutet jedoch nicht, dass wenn ein anderer Thread (in diesem Fall der Ereignisfaden, der das verarbeitet MouseListener) ruft eine Methode in Ihrem auf Runnable dass es durch den Thread ausgeführt wird, der das ausführt Runnable. Wenn eine Methode aufgerufen wird, wechselt sie nie zu einem anderen Thread. Wenn Sie dies möchten, benötigen Sie einen Mechanismus. Zum Beispiel eine Warteschlange, die die MouseListener kann Aufgaben zu und in Ihrem veröffentlichen Runnable.run() Sie suchen dann weiter nach einer neuen Aufgabe.

Andere Tipps

Wenn Swing initialisiert, startet der eigene Ereignis -Versand -Thread. Alle Ihre Hörermethoden werden in diesem Thread ausgeführt. Es spielt keine Rolle, ob Ihr Hörerobjekt Runnable implementiert oder nicht.

Siehe dieses Tutorial, um die Grundlagen des Multi-Threading im Zusammenhang mit dem Schwung zu erfassen. http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html

Die tatsächliche Antwort auf Ihre Frage ist in diesem Teil des Tutorials:

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

Aber ich schlage vor, dass Sie das gesamte Tutorial durchlaufen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top