Themen: Nur was macht sie verwirrend? Zwei Runnables mit Maushörer
-
21-09-2019 - |
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?
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.