Praktikum 4: Grafiken und Ereignisse Aufgabe 1: Java Applikation Bisher haben wir in Java (ebenso wie in C) jeweils selbständige Konsole-Applikationen erstellt. Java wurde als Programmiersprache für das Internet konzipiert. Java-Programme können auf zwei Arten ausgeführt werden: Applets: Das sind Java-Programme, die in Webseiten eingebettet sind und gemeinsam mit der Webseite von einem Server geladen werden. Diese Programme werden als Klassen- Dateien (Endung.class) auf dem Server zusammen mit der Webseite (HTML-Datei) gespeichert und (ähnlich wie Bilddateien) dann in den Browser des Client-Rechners geladen und in der Webseite angezeigt. Der Browser stellt das Fenster für die Ausgabe sowie die JVM zur Verfügung. Applets werden heute nicht mehr verwendet (R.I.P.) Selbständige Applikationen: Vergleichbar mit den C-Programmen, aber auch graphische Applikationen sind möglich. Schreiben Sie eine Applikation, die folgende Ausgabe erstellt. Gehen Sie dabei von der Hello.java Vorlage aus (siehe auch Vorlesungsfolien) Gerrit Burkert, Karl Rege 22.03.16 1
Aufgabe 2: Ballon-Grafiken Erstellen Sie eine Ballon-Klasse (siehe Folien). Statt direkt die Graphik in der Paint-Methode zu zeichnen, soll ein Ballon Objekt erstellt werden und die draw-methode des Ballons aufgerufen werden. Erste Version Die Methode initcomponents wird von der main-methode aufgerufen. Sie kann verwendet werden, um das Ballon-Objekt zu erstellen. Das neue Ballon Objekt soll dann in einer Instanzvariablen Ballon ballon gespeichert werden. In der paint-methode des Frames wird dann die draw- Methode des Ballons aufgerufen und das Graphics Objekt übergeben. Zweite Version Es soll zusätzlich ein Zähler dargestellt werden; dieser Zähler soll als eine private Instanzvariablen counter von Ballon gespeichert sein. Es soll eine Methode void erhöhezähler() der Ballon Klasse in der actionperformed-methode aufgerufen werden - bevor das Neuzeichnen ausgelöst wird. usw. Hinweis: drawstring benötigt einen String als erstes Argument. Auf einfache Weise kann man aus einer Zahl einen String machen, indem man sie an den leeren String anhängt: ""+5 ergibt den String "5". Dritte Version Es sollen mehrere Ballone gezeichnet werden; dafür müssen sie in einen Array gespeichert werden. Die Nummer soll als statische Variable von Ballon jeweils beim Konstruktor Aufruf (von Ballon) um eins erhöht werden und der Instanzvariablen zugewiesen werden. Mit folgender add- Methode (Teil des Frames) wird der neue Ballon hinzugefügt. In der paint Methode werden dann alle Ballone gezeichnet. private Ballon[] ballone = new Ballon [100]; private int count = 0; public void add(ballon b) { ballone [count] = b; count++; public void paint(graphics g) { super.paint(g); for (int i = 0; i < count; i++) { ballone [i].draw(g); Gerrit Burkert, Karl Rege 22.03.16 2
Passen Sie die Ausgabe so an, dass die Ballone zufällig im Fenster positioniert werden: Für die zufällige Position benötigen Sie eine Möglichkeit, Zufallszahlen zu erzeugen. Sehen Sie in der Java-Dokumentation nach der random-methode der Math-Klasse. Die Koordinatenangaben für filloval sind ganzzahlig. Sie sollten also noch eine Typumwandlung nach int vornehmen. Vierte Version Die Kugeln sollen nun zufällig ausgewählte Farben haben (Bild auf der nächsten Seite). Eine beliebige Farbe kann man auch auf folgende Weise erzeugt werden: new Color(0.5, 0.5, 1.0); Auf diese Weise wird ein neues Objekt der Klasse Color erzeugt. Die drei Parameter sind der Rot-, Grün- und Blauanteil der Farbe. Sie werden als double-zahlen übergeben. Mit diesen Informationen sollten Sie auch zufällige Farben erzeugen können. Math.random() liefert übrigens eine double-zahl. Auch wenn hier jeweils g.setcolor steht: Die Variable für das Graphics-Objekt könnte man jederzeit auch anders nennen als g. Gerrit Burkert, Karl Rege 22.03.16 3
Falls Sie noch weitere Dinge ausprobieren möchten: Die Kugeln könnten auch unterschiedlich gross sein. Ausserdem ist die weisse Beschriftung auf den helleren Kugeln schlecht lesbar. Könnte man erreichen, dass die dunklen Kugeln mit weisser Schrift und die helleren schwarz beschriftet werden? Aufgabe 3: Mehrere Knöpfe, Up-/Downcounter Schreiben Sie ein Frame, das eine Zahl anzeigt, die durch zwei Buttons inkrementiert und dekrementiert werden kann: Dafür müssen (statt der JButton action Variable) zwei Instanzvariablen folgendermassen deklariert werden: JButton less,more; In der initcomponents Methode müssen entsprechend zwei Knöpfe erstellt und hinzugefügt werden. private void initcomponents() {... less = new JButton("less"); panel.add(less); less.addactionlistener(this); more = new JButton("more"); Gerrit Burkert, Karl Rege 22.03.16 4
panel.add(more); more.addactionlistener(this); In der ActionPerformed Methode muss jetzt unterschieden werden, welcher Knopf das gedrückt wurde. Dafür können Sie folgendes Gerüst verwenden. public void actionperformed(actionevent e) { if (e.getsource() == less) { // dekrementiere Instanzvariable else if (e.getsource == more) { // inkrementiere Instanzvariable paint(getgraphics()); Hinweise Der angezeigte Zahlenwert value wird als Instanzenvariable (Attribut) der Klasse geführt, da von verschiedenen Methoden auf den Wert zugegriffen werden muss. Ebenso wird die Schriftart definiert. Das Schlüsselwort final legt sie als konstant fest. Ergänzen Sie oben in der Klasse noch die beiden Variablen, die später Referenzen auf die Buttons enthalten sollen. In der initcomponet()-methode wird das Frame initialisiert. Erzeugen Sie die beiden Button-Objekte (new) und fügen diese dem Applet hinzu (add). Beide Buttons müssen dann noch um einen ActionListener ergänzt werden. Dazu nehmen wir das Frame-Objekt selbst (this). Im Event Handler (actionperformed) stellen Sie fest, welcher Button das Ereignis ausgelöst hat. Die Quelle des Ereignisses bekommt man mit e.getsource(). Entsprechend wird der gespeicherte Wert inkrementiert oder dekrementiert. In der paint-methode müssen Sie nur noch die Ausgabe des Zahlenwertes ergänzen. Gerrit Burkert, Karl Rege 22.03.16 5