Einstieg in Java2D

Veröffentlicht: 17. Mai 2011 in Multimedia
Schlagwörter:,

Mit Java2D habe ich begonnen einen weiteren Teilbereich der multimedialen Verwendung von Java zu erkunden. Dabei entstanden wieder zwei kleine Programme, die ich hier kurz vorstellen möchte.
Das sind zum einen eine kleine Uhr, die einem zusätzlich das aktuelle Datum ausgibt und zum anderen ein Programm mit dem man drei verschiedene geometrische Formen in unterschiedlichen Farben zeichnen lassen kann.

Uhr
Implementierung

Den Einstieg in Java2D habe ich mit der Programmierung einer Uhr gemacht, die zusätzlich das aktuelle Datum ausgibt. Dabei habe ich hier ähnlich wie beim Musikplayer schon mit einer inneren Klasse ZeitAusgabe für den Thread gearbeitet, der die Zeit immer aktuell hält. Dies geschieht in der run()-Methode der Klasse ZeitAusgabe.

public void run() {

	while (true) {

		currentTime = new Date();
		time = formatter.format(currentTime);
		Zeit.repaint();

		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

Der Aufruf der Variable time erfolgt dann in der paint()-Methode der Klasse Clock.

 @Override
 public void paint(Graphics g) {
	g2 = (Graphics2D) g;
	Font f = new Font("Arial", 50, 50);
	g2.setFont(f);
	g2.drawString(time, 20, 120);
 }

Hierbei wird zudem die Schriftart auf Arial gesetzt und die Schriftgröße 50 gewählt. Graphics2D
bietet dabei die notwendigen Methoden, um die gewünschte Schriftgestaltung auf das Grafik-Objekt zu legen und den String mit Zeit und Datum auszugeben.

Screenshot

So sieht das fertige Programm aus:

Objektzeichner
Funktionsumfang

Der Funktionsumfang des Programms besteht darin, die Formen Ellipse, Rechteck und Rechteck mit abgerundeten Ecken in den Farben rot, grün und blau auf einem Canvas zeichnen zu lassen. Dabei können die Formen zusätzlich um einen benutzerdefinierten Winkel rechts oder links herum gedreht werden. Die Bedienung erfolgt über Buttons und RadioButtons.

Screenshot

So sieht das Programm ausgeführt aus:

Klassendiagramm

Implementierung

Die Entwicklung des Objektzeichners mit Java2D erfolgte zunächst mit einer Analyse der Aufgabenstellung und somit auch der Anforderungen an das Programm. Dafür dienten User Stories und die Zerlegung der Implementierung in mehrere Teilprobleme. Dabei waren die grundlegenden Schritte zunächst eine grafische Benutzeroberfläche zu gestalten und einen Prototypen des Programms herzustellen, der mit Hilfe eines Loggers dann die Verbindung von GUI und dem Canvas, welches in einer separaten Klasse MyCanvas umgesetzt wurde zu überprüfen.

Der nächste Schritt verschaffte dem Programm die erste Funktionalität durch das Implementieren der paint()-Methode. Auch hier wurde das Teilproblem wieder in mehrere Teilprobleme unterteilt. Die Aufteilung erfolgte in die jeweiligen Formen, die in den einzelnen Schritten nacheinander eingefügt wurden. Nachdem die einzelnen Formen sich zeichnen ließen, kam die Verbindung mit den Radio-Buttons an die Reihe. Durch eine Switch-Case-Anweisung wird nun überprüft, ob eine Ellipse, ein Rechteck oder ein Rechteck mit abgerundeten Ecken zu zeichnen ist, welches dann über Zufallszahlen sowohl die Koordinaten für den Ort auf dem Canvas als auch die Werte für Höhe und Breite und im Falle des abgerundeten Rechtecks noch die Parameter wie stark die Ecken abgerundet werden sollen, bekommt. Zu diesem Zeitpunkt ist es nun möglich über die GUI mittels des Zeichnen-Buttons schwarze Formen zu zeichnen, die an zufälligen Orten erscheinen. Dabei kann der Benutzer zwischen den drei Formen mit Hilfe von Radio-Buttons, welche in einer ButtonGroup angeordnet sind, auswählen und dann die gewünschte Form zeichnen lassen. Da die Formen nun auch verschiedene Farben annehmen sollten, war dies der nächste Schritt in meiner Implementierung. Da die Farben auch über RadioButtons, welche sich ebenfalls einer zweiten ButtonGroup befinden realisiert wurden und es nahe lag, die Farbauswahl zentral zu regeln habe ich eine Methode setColor() implementiert, welche die jeweilige Farbe an die paint()-Methode übergibt und somit setzt.

Die nächste Funktionalität, die auf dem Abarbeitungsplan der Teilkomplexe des Programms stand war das Rotieren. Dieser Schritt barg einige Probleme in sich, die es zu lösen galt. Zunächst benötigt man einen Winkel, der aus dem Textfeld ausgelesen wird und den jeweiligen Methoden dreheLinks() bzw. dreheRechts() übergeben wird. Zum rotieren selbst wird die rotate()-Methode verwendet, welche das Canvas schon von Haus aus mitliefert. Diese gibt es zum einen in der Ausführung, dass man nur einen Winkel angibt, wodurch sich die richtige Drehung zwar ergibt, das Objekt jedoch aus dem Bildschirm entschwindet, weil sich das gesamte Koordinatensystem dabei dreht. Die Lösung für dieses Problem gab es ebenfalls bei der rotate()-Methode, da diese überladen ist und noch eine weitere Variante anbietet, in der man neben dem Winkel auch die Koordinaten, wo das gedrehte Objekt auftauchen soll, übergeben wird. Mit Hilfe dieser Methode war nun also auch das Problem gelöst und das Rotieren funktionierte.

Zuletzt fehlte nun noch, dass man das Canvas wieder leeren kann, nachdem man das Objekt darauf platziert hat. Dafür habe ich eine Methode clearCanvas(), welche einen Boolean clear auf true setzt, wodurch in der paint()-Methode eine if-Anweisung ausgeführt wird, die dann ein Viereck in der größe des Canvas in seiner Hintergrundfarbe neu malt, wodurch das Canvas dann wieder leer erscheint.

Downloads

Hier gibt es sowohl die ausführbaren jar-Dateien als auch den Quellcode zum Downloaden:

Uhr:
Source
Ausführbare jar-Datei

Objektzeichner:
Source
Ausführbare jar-Datei

Advertisements

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s