# Bootrennen



## Rene_93 (29. Nov 2014)

Guten Tag zusammen.

Ich bin neu hier und hoffe, dass ich hier Hilfe für mein Problem finde. Für meine Ausbildung zum staatlich geprüften Techniker für Elektrotechnik muss ich in Java ein Bootrennen programmieren. Wenn man auf den Start Button drückt, sollen sich Boote mit verschiedenen, zufälligen Geschwindigkeiten über den Bildschirm bewegen. Momentan probiere ich dies mit Textfeldern, später möchte ich noch Bilder implementieren. Mein Problem ist nun, dass ich die Boote zwar provisorisch über einen Button weiter klicken kann, jedoch funktioniert das ganze nicht automatisch. 

Ich habe eine for Schleife erstellt, die mit meinen Wert der X Achse meiner GUI immer um einen Zufallswert weiter schieben soll. Hier der Quelltext. 

```
JButton btnStart = new JButton("Start");
		btnStart.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent arg0) {
				
				
				for (int i = 0; i < 160; i++) {
				
				Speed1 = Speed1 + (int)Math.round(Math.random()*10);
				tFBoot1.setBounds(Speed1, 225, 80, 20);
				Speed2 = Speed2 +(int)Math.round(Math.random()*10);
				tFBoot2.setBounds(Speed2, 256, 80, 20);
				Speed3 = Speed3 +(int)Math.round(Math.random()*10);
				tFBoot3.setBounds(Speed3, 287, 80, 20);
				Speed4 = Speed4 +(int)Math.round(Math.random()*10);
				tFBoot4.setBounds(Speed4, 318, 80, 20);
				Speed5 = Speed5 +(int)Math.round(Math.random()*10);
				tFBoot5.setBounds(Speed5, 349, 80, 20);
				repaint();
				try {
					Thread.sleep(17);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
				}
				 
			}
		});
		btnStart.setBackground(UIManager.getColor("Table.selectionBackground"));
		btnStart.setForeground(Color.BLACK);
		btnStart.setBounds(78, 547, 120, 50);
		contentPane.add(btnStart);
```

Bis jetzt passiert aber nur, dass wenn ich auf "Start" drücke, das Programm für 160*17ms "einfriert" und meine Felder nach dieser Zeit am Ende meiner "Rennstrecke sind". Ich brauche aber das jeder einzelne Schritt angezeigt wird, sprich das Boot zum Ziel schwimmt. 

Meine Fragen sind nun, bin ich mit der Funktion "Thread.sleep" auf dem richtigen Weg? Brauch ich die Funktion "repaint" um dies zu realisieren und wenn ja, wie schreibe ich diese richtig in mein Programm?

Ich hoffe ihr könnt mir weiter helfen, weil von diesem Fach hängt momentan mein Weiterkommen in der Weiterbildung ab.

Mit freundlichen Grüßen

René


----------



## JCODA (29. Nov 2014)

Das Problem an Thread.sleep() ist, dass du es einfach so aufrufst und den derzeitigen Thread (den Event Dispatcher Thread), der auch das Zeichnen übernimmt schlafen legst. Du musst entweder einen TimerTask verwenden, oder etwas "unsauberer" den SwingTimer, oder du lagerst das ganze in einen eigenen Thread aus. Der kann dann parallel zum zeichen bzw. zur restlichen Logik laufen. Um eine "flüssige" Animation hinzubekommen, könnte es sich lohnen mit der Zeitdifferenz zu rechnen sodass du letztendlich rechnest Weg = alterWeg + Zeitdifferenz*Geschwindigkeit.


----------



## Rene_93 (30. Nov 2014)

Ich hab das jetzt mal mit dem TimeTask versucht, aber irgendiwe gibt er mir dann in der Console immer einen Error aus. Ich verstehe aus Erklärungen die ich gesucht habe auch nicht genau, wie ich TimeTask anwende. Ich habe noch ein Buch (Grundkurs Programmieren in Java 8), jedoch steht dort gar nichts über TimeTask drin.


----------

