Kann Thread nicht richtig beenden.

  • Themenstarter Themenstarter w00dy
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
W

w00dy

Gast
Hallo!

Ich habe eine Threadklasse in der ich ein panel immer neu repainte, hier der Code dazu:
Code:
public class MyThread extends Thread{
	private MyPanel panel;
	private boolean stop;
	
	public SnakeMoving(MyPanel panel){
		this.panel = panel;
	}
	
	public void run(){
			while(!stop){
				panel.repaint();
				try{
					sleep(200);
				}catch(Exception e){
				}
			}
	}
	
	public void cancel(){
		stop = true;
	}
}

Zusätzlich habe ich noch eine zweite Klasse MyPanel, in der ich per überschreiben der Methode paint() Grafische (bewegte) Objekte hinzufüge wie z.B. Rechtecke.

Diese Rechtecke können gesteuert werden mit den Pfeiltasten. Wenn ein Rechteck jetzt den Rand berührt, dann soll in einem JOptionPane "Game Over" ausgegeben werden und der Thread gestoppt werden.
Hier der Auszug aus der MyPanel-Klasse, bei dem abgebrochen werden sollte:
Code:
if(x < 0 || y < 0 || x >= getWidth()-10 || y >= getHeight()){
			thread.cancel();
			JOptionPane.showMessageDialog(null,"Game Over!"
											+"\nSie haben "+score+" Punkte erreicht.");
		}

Nun ist es so, dass wenn ein Rechteck beispielsweise den Rand berührt, wird zwar "Game Over" in einem JOptionPane angezeigt, aber es wird irgendwie weiterhin immerwieder neugezeichnet (Das JOptionPane), denn wenn ich auf OK drücke, passiert nicht viel, denn es wird weiterhin angezeigt (bzw. neu gezeichnet). Ich denke dass der Thread nicht richtig beendet wird, sondern irgendwie weiterläuft oder ähnlich.
 
gugg mal in die API
interrupt()
isInterrupted()
interrupted()
 
Mit folgendem Methodenaufruf setze ich die Variable "stop" sowieso auf false, damit wird das panel.repaint() im Thread nicht weiter ausgeführt:
Code:
thread.cancel

Ich habe nun herausgefunden, dass zwar das panel.repaint() im thread nicht weiter ausgeführt wird. Jedoch irgendwie die JOptionPane Message nonstop repaintet wird....

Weiß einer woran das liegt? Ich bitte um Hilfe.
 
w00dy hat gesagt.:
Jedoch irgendwie die JOptionPane Message nonstop repaintet wird....

...was widerum nur heißen kann, daß deine if-Abfrage (if (x<0 || y<0...) selbst andauernd
aufgerufen wird.

Steckt die denn ebenfalls in einem seperatem Thread? ???:L
 
Nein es steckt alles im selben Thread, und daher dachte ich, dass ich mithilfe von:
Code:
thread.cancel();

Den Thread dazu bringe, dass er mir das nicht nonstop repaintet....aber anscheined klappt es nicht =(
 
Es kann nicht im selben Thread stehen, da du desse run-Methode ja gepostet hast.

Wo genau steht denn dein Abfrage
Code:
  if (x<0 || y<0...)
und wann wird sie aufgerufen?

Wenn einmal die Bedingung erfüllt ist, aber die Abfrage ständig
weiter durchgeführt wird, ergibt sich halt der wiederholte Aufruf
von JOptionPane
 
Die Abfrage steht in der "MyPanel" klasse, innerhalb der paint() Methode...
 
Na dann ist doch alles klar! 😀

1. Die paint-Methode wird vom System aufgerufen
2. Die JOptionPane geöffnet und verdeckt dein Panel
3. Die JOptionPane wird geschlossen und deshalb muß das Panel neu gezeichnet werden
4. Weiter bei 1. 😎

Nimm die Abfrage aus der paint-Methode raus und schreibe sie dorthin,
wo die Steuereung erfolgt.
 
DANKE!
Ich werde das programm neu strukturieren müssen, da ich in der Paint methode auch die steuerung drinnen habe usw...
 
Anonymous hat gesagt.:
da ich in der Paint methode auch die steuerung drinnen habe usw...

Wie hast du das denn geschafft? :shock: :autsch:

Für die Steuerung mußt du doch sowieso KeyListener verwenden, die
außerhalb jeder Methode stehen. ???:L
 
Achso das meinst du, ja und der KeyListener ist in einer anderen Klasse...in der Frame klasse^^
 
Nein der KeyListener wird schon in der Klasse deklariert, wo der KeyEvent
ihn benachrichtigen soll.

Ich meine nur, daß der Code von z.B. keyPressed(KeyEvent e) {...} eben nicht
Bestandteil einer Methode ist sondern, gewissermaßen, selbständig.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben