Endlosschleife?

Conners

Erfahrenes Mitglied
Hallo,

ich hab n Problem, was wahrscheinlich wieder genau deshalb auftritt, weil ich alles falsch mach, aber ich erklärs erstmal :)

Ich hab ein StartButton und wenn ich den klicke soll ab dann das Programm solange in einem Label die aktuelle Mausposition ausgeben, bis ich einen StopButton drücke.

Ich habs bisher immer als Endlosschleife gemacht, entweder direkt im jFrame, dann hängt allerdings der Button oder als neuen Thread, aber den krieg ich dann nicht gekillt.

Kann mir jemand Tips geben wie mans richtig macht? Ich möcht ja auch gern, dass wenn ich Stop drück der Thread gekillt wird...

Und ich hab noch ne kleine Frage. Ich hab irgendwo gelesen, dass bei Thread.sleep der Thread schlafen gelegt wird, aber bei mir wird nie ne InterruptedException geworfen, egal wieviele Sachen ich nebenbei mache...


Danke im voraus
Gruß
Conners
 
Endlosschleifen sind meistens nicht so toll.

Versuchs doch mal mit einem Listener, der auf Mausbewegung reagiert udn hau den Thread weg :)

http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/MouseMotionListener.html

Vielleicht ist das schon, was du suchst!

Das Flag kannst du beibehalten und je nach Button setzen oder zurücksetzen.
Den Status vom Flag könntest du dann bei mouseMoved(MouseEvent me) abfragen. Die Mausposition wird durch me.getX() und me.getY() ermittelt (oder auch me.getPoint(), wenn du die Koordinaten als Punkt haben möchstest), welche du dann in dein Label schreiben kannst.

Edit: Also bei mir funktioniert das super. Hab mir mal testweise einen kleinen Frame gebaut, welcher ein Textarea besitzt. Diesem Textarea hab ich den MouseMotionListener hinzugefügt. Unten ist dann eine Leiste mit dem Label und den 2 Bottuns. Die Buttons verändern jeweils nur das Flag. Wenn das Flag auf true gesetzt ist, wird der Text im Label entsprechend der Mausposition geändert.

Edit: Eine andere Möglichkeit wäre beim Klick der Buttons den MouseMotionListener hinzuzufügen bzw. zu entfernen. Rein vom Logischen her wär dies wahrscheinlich sogar die performantere Art und Weise, da, wenn der Button "Stop" gedrückt wurde so beim Bewegen der Mouse nicht immer das Flag überprüft wird.
 

Anhänge

  • Beispiel.jpg
    Beispiel.jpg
    7 KB · Aufrufe: 30
Zuletzt bearbeitet:
Danke, das mit dem Flag war ne gute Idee, weil es klappt :)

Das mit dem Listener hab ich direkt auch mal ausprobiert und sowas ähnliches gebaut wie du, und das gefällt mir sogar noch besser.

Allerdings lass ich in meinem Programm nicht die Maus durch den Benutzer bewegen, sondern durch eine Robotinstanz und der soll halt immer das Gleiche machen. Das soll eine Art kleines Programm zum Vorführen werden.

Aber das mit dem Flag funktioniert soweit, danke euch!

Gruß
Conners
 
Soweit ich weiß müsste es egal sein, wodurch die Maus bewegt wird, das Event wird ausgelöst, wenn sie bewegt wird.

Edit:
Ich nehme an du nutzt die Class Robot, etwa so:

Java:
Robot robot = new Robot();
robot.mouseMove(x,y); // löst Event aus?

Falls du es so machst könntest du doch genauso gut nach jedem mouseMove(x,y) die übergebenen Koordinaten in dein Label schreiben oder?
 
Zuletzt bearbeitet:
Ich schreibe nach jedem MouseMove die Koordinaten in das Label rein. Allerdings nicht via Listener und MouseEvent, sondern ich hol mir die Mausposition separat, aber ich habs jetzt schon wieder geändert und selbst bei Robot auf Listener umgestellt :)

Danke!
 
Wie ich so bin habe ich es auch selbst einmal getestet auf 2 Wege:

1. Die Maus soll bewegt werden beim Klick auf "Start".
2. Die Maus soll bewegt werden beim Mausklick.

Beide haben die Mausbewegt, allerdings ist nur im Fall 1 das Event ausgelöst wurden.
Leider weiß ich nicht wieso. Hoffe bei dir löst es aus!
 
Bei mir funktioniert beides, allerdings bei Punkt 2 nur, wenn ich auf das Frame klicke. Ich hab im Frame addMouseListener gemacht und das heißt ja es wird nur das Event ausgelöst, wenn man im Frame was anklickt. Das Gleiche gilt natürlich auch für MouseMotion etc.
Sofern das alles richtig ist, was ich da grade geschrieben hab :)
..gibts ne Möglichkeit den Listener irgendwie so in einem Javaprogramm zu implementieren, dass Events ausgelöst werden, z.B. ein mousePressed, was außerhalb des aktuell laufenden JavaProgramms ausgelöst wird? Also dass ich dem komplettem Bildschirm als Teil des JavaProgramms die Listener zuordenen kann?

Ansonsten krieg ich ja nicht die aktuelle MousePosition via MouseEvent raus, wenn ich mit der Maus außerhalb des Programms langbewege oder?

Gruß
Conners
 
Zuletzt bearbeitet:
Ja, convertPointToScreen klappt. Zwar nicht so wie ich es mir gedacht hab, aber sieht schön aus. Dank dir :)

Ich hab noch ein wenig nachgelesen und statt einer angelegten booleanVariable nutze ich nun interrupt() und isInterrupted().
Funktioniert genauso gut und man muss keine Variablen setzen! Allerdings muss man wenn man interrupt von außen aufruft im InterruptedException-catchTeil interrupt() nochmal aufrufen, keine Ahnung wieso. Aber diesmal hat er richtig bei jedem erneutem Start finalize aufgerufen, was ja bedeutet, dass der Thread vernichtet wurde oder?

Aber wieso wird der alte Thread erst vom GC zerstört, wenn ich erneut start drücke und nicht direkt nachdem run() durchgelaufen ist?
Das frage ich deshalb, weil ich gerne wissen möchte, ob ein Thread immernoch "alive" ist, wenn er interrupted wurde und run() durchlaufen ist, aber er noch nicht von der GC gekillt wurde... Bezieht sich auf die Funktion Thread.isAlive()
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück