Teilaufgabe TurtleVisualizer

Fricko

Mitglied
Hallo,

ich hab mich hier mal angemeldet um bei einer Aufgabe vll Hilfe zu bekommen. Es geht um eine Turtle-Aufgabe und in der Teilaufgabe soll ich eine kleine GUI entwickeln. Ich lad ma die genau aufgabenstellung hoch.
TurtleVisualizer
Um die Turtle-Grafiken anzeigen zu können, brauchen wir eine Klasse, die dazu in der Lage ist nicht nur einfache Befehle ausführen zu können, wie die TurtleTransformer, sondern ganze Programme. Schließlich soll das Resultat eines Programms auch angezeigt werden können.
Dazu bedienen wir uns der Bibliothek javax.swing um eine kleine GUI zu entwickeln, ohne jedoch tiefer in das Thema eindringen zu müssen. Die beiden wesentlichen Klassen, die wir benötigen ist zum einen javax.swing.JFrame, welche die Funktionalität ein Fenster darzustellen liefert. Die andere Klasse ist javax.swing.JPanel: Das ist ein allgemeiner grafischer Container, in den man Zeichnen kann. Diesen muss man nur in den JFrame einfügen. Ein JPanel verfügt über eine Methode paintComponent(Graphics g), die vom swing Framework Aufgerufen wird, wenn das JPanel konkret dargestellt werden soll. Ein normales JPanel tut dabei nicht viel, wir werden aber eine Subklasse von JPanel erstellen, die diese Methode überschreibt.
Die Java-Swing-Klassen sind sehr gut dokumentiert. Bitte denken Sie daran und lesen Sie die entsprechende API, falls Sie auf Fragen und Probleme stoßen!
Dazu entwickeln Sie bitte die Klasse TurtleVisualizer, die javax.swing.JPanel erweitert. Die Klasse hat mindestens die folgenden Felder:

protected Turtle startTurtle;
protected TurtleTransformer transformer;
protected String turtleProgram;

Die Klasse hat den folgenden Konstruktor:

public TurtleVisualizer(Turtle startTurtle, int sizeX, int sizeY, String program, TurtleTransformer t)

Die Argumente sizeX und sizeY sollen dabei die Größe des Zeichenbereichs, also des Bereichs, in dem die Turtle sich bewegt, bestimmen. Diese Argumente bestimmen auch die Größe in Pixel mit der der TurtleVisualizer in einer GUI angezeigt wird. Eine IllegalArgumentException soll geworfen werden, falls einer der Parameter auf null gesetzt ist.
Mit der folgenden Methode kann dem TurtleVisualizer ein neues Programm zugewiesen werden. Eine IllegalArgumentException soll geworfen werden, falls der Parameter auf null gesetzt ist.

public void setProgram(String p)

Die Methode paintComponent von JPanel soll überschrieben werden. Es handelt sich dabei um eine callback-methode, die von der Grafikkomponente aufgerufen wird, in die der TurtleVisualizer eingebettet ist, wenn sie gezeichnet werden soll. Zum Zeichnen der Turtle-Grafik, benutzen Sie bitte die Methoden der Klasse Graphics. Eine Instanz dieser Klasse wird paintComponent als Argument übergeben.

protected void paintComponent(Graphics g)

Diese Methode wird also aufgerufen, wenn das Bild, das die Turtle produziert, gezeichnet werden soll. Dazu muss beginnend bei der durch den startTurtle gegebenen Position das turtleProgramm komplett durchlaufen werden und entsprechende Linien gezeichnet werden. Das von der Turtle produzierte Bild soll dabei stets exakt mittig im Zeichenbereich abgebildet erscheinen. Es macht nichts, wenn die Zeichnung über den Rand des dargestellten Bereichs hinausgeht. Benutzen Sie die durch das gegebene Graphics-Objekt vorgegebene Zeichenfarbe. Verändern Sie die Hintergrundfarbe nicht. Skalieren Sie die Grafik so, dass die Turtlekoordinaten 1-zu-1 in das Koordinatensystem des Graphics-Objects umgesetzt werden (mit anderen Worten: Ändern Sie nichts an der Skalierung).

Sry für den langen Text ich hoff des geht trotzdem und hier mein Code bis jetzt:
Java:
package jpp.turtlegraphics;

import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.JPanel;

public class TurtleVisualizer extends JPanel {

	protected Turtle startTurtle;
	protected TurtleTransformer transformer;
	protected String turtleProgram;
	protected int sizeX;
	protected int sizeY;
	
	public TurtleVisualizer(Turtle startTurtle, int sizeX, int sizeY, String program, TurtleTransformer t)
		throws IllegalArgumentException {
			if (sizeX == 0 || sizeY == 0)
				throw new IllegalArgumentException();
		
		this.startTurtle = startTurtle;
		this.sizeX = sizeX;
		this.sizeY = sizeY;
		this.turtleProgram = program;
		this.transformer = t;
		this.setPreferredSize(new Dimension(sizeX, sizeY));
	}
	
	public void setProgram(String p) throws IllegalArgumentException{
		if (p == null)
			throw new IllegalArgumentException();
	
	}
	
	
	
	protected void paintComponent(Graphics g){
		
		for(int i=0;i<=turtleProgram.length()-1;i++){
			turtleProgram.charAt(i)
		}
		
	}
}

Des hab ich mit Hilfe bis jetzt hinbekommen, aber da fehlt ja noch Zeug z.b bei der setProgram-Methode. Hab aber keine Ahnung wie ich des machen soll. Hoff ein paar Profis hier können mich unterstützen bin ein bisschen verzweifelt. VIELEN VIELEN DANK.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ansätze dazu? Irgendwo muss spezifiziert sein, wie so ein "Programm" aussieht. Vermutlich ein String, den man mit einem StringTokenizer in einzelne Befehle zerlegen kann, die man dann ausführen kann...
 

Fricko

Mitglied
Hallo,

danke für deine Antwort. Es handelt sich um eine größere Aufgabe mit mehreren Klassen. Am Ende soll eine Turtle ein 8eck zeichnen. Und in der Aufgabenstellung soll die Klasse TurtleVirtualizer implementiert werden. Den Code den ich gepostet habe, jetzt bis jetzt alles was ich mit Hilfe zusammenbekommen habe. Leider weiß ich nicht wie ich die Aufgabe fertigstellen soll und hab gedacht vll kann des ein Profi von hier. Bin nämlich ziemlich ratlos und ohne den TurtleVirtualizer kann ich die Aufgabe nicht abgegebn. Vielen Dank schonmal. THX
 

Pepe Rohny

Aktives Mitglied
Hi,

wie sieht denn so ein "Programm" aus? Ist das vielleicht eine Liste von Koordinaten?

"Das von der Turtle produzierte Bild soll dabei stets exakt mittig im Zeichenbereich abgebildet erscheinen."
"Die Argumente sizeX und sizeY sollen dabei die Größe des Zeichenbereichs, also des Bereichs, in dem die Turtle sich bewegt, bestimmen."
=> Grösse der Komponente (JPanel) ermitteln, und Zeichenbereich darin zentrieren => Ursprung des Koordinatensystems für die Koordinaten des Programms => graphics.drawLine(...)
das kann alles innerhalb von paintComponent(Graphics g) gemacht werden

Pepe

P.S.
man sollte einen String nicht nur auf null testen - die Länge kann auch 0 sein
 

Fricko

Mitglied
Des Programm steht für eine Zeichenfolge wie zb. "m+m+m+m+m+m" wobei z.b
m = "Bewege Dich nach vorne und Zeichne eine Linie"
+ = "Drehe Dich um 120° nach rechts"
und die Methode muss ich iwie implementieren. Sry bin sau der Anfänger, muss in meinem Studiengang(WiMa) leider so ein Java Praktikum machen.

Und bei der Methode paintComponent wurd mir soweit geholfen.
Java:
protected void paintComponent(Graphics g){
		
		for(int i=0;i<=turtleProgram.length()-1;i++){
			turtleProgram.charAt(i)
		}

Würde es was bringen mal die ganze Aufgabe zu posten? Danke für alle Hilfen.
 

Pepe Rohny

Aktives Mitglied
Des Programm steht für eine Zeichenfolge wie zb. "m+m+m+m+m+m" wobei z.b
m = "Bewege Dich nach vorne und Zeichne eine Linie"
+ = "Drehe Dich um 120° nach rechts"
???:L lass mal sehen

WiMa? was das denn?

Und bei der Methode paintComponent wurd mir soweit geholfen
da werden die Anweisungen gelesen wohin es gehen soll. Die müssen jetzt in Koordinaten umgesetzt werden - das ist alles. Klar: gezeichnet werden muss natürlich auch ...

Würde es was bringen mal die ganze Aufgabe zu posten? Danke für alle Hilfen.
mach ma ...

Pepe
 

Neue Themen


Oben