Versuchsziele Vertiefung im Verständnis der JFrame-Programmierung, Benutzung von Klassen für die Grafikanzeige.

Ähnliche Dokumente
Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

Grafik-Programmierung

Schlussendlich geben wir die Listen aus. Es kommt zu folgender Ausgabe:

Arbeitsblatt 6: Programmierung geometrischer Figuren

Fragen zur OOP in Java

Tutorial04: Swing: Erstellen eines JFrames mit einem JSplitPane

Einführung in die Programmierung

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Vertiefung im Verständnis der SDI-Programmierung mit der Tabelle ListView unter Visual Studio 2008.

Durch die Möglichkeit, Ein- und Ausgaben auf der Konsole durchzuführen, kann man auch systematisch das Verhalten von Klassen analysieren.

Humboldt-Universität zu Berlin Wintersemester 2010/11 Institut für Informatik Grundlagen der Programmierung. 6. Übungsblatt

Versuchsziele. Grundlagen. Überblick: FB Automatisierung und Informatik Betriebssysteme Thema: Bounded-Buffer-Problem. 3.

Objektorientierte Programmierung Studiengang Medieninformatik

ADT: Java Collections und ArrayList

Implementieren von Klassen

Der Ball kann angezeigt werden: anzeigen( ) {... } Der Ball kann z.b. seine Größe verändern: groesseaendern(int veraenderung) {... } usw.

Grafikausgabe mit dem Abstract- Windowing-Toolkit. Eine Einführung

Kapitel 13. Abstrakte Methoden und Interfaces. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

pue08 December 9, 2016

Staubsauger-Roboter. Als Vorlage dienen dir drei Klassen: RECHTECK Damit kannst du die Wände des Raums darstellen.

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke

Versuchsziele Kenntnisse in der Anwendung von: Sortieren mit Klassen Benutzung von generischen Klassen o Definition o Sortierung.

Probeklausur: Programmierung WS04/05

Theorie zu Übung 8 Implementierung in Java

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

Allgemeines - Prinzipien

Einstieg in die Informatik mit Java

Objektorientierung. Programmierstarthilfe WS 2010/11 Fakultät für Ingenieurwissenschaften und Informatik

Graphische Nutzerschnittstellen

Probeklausur Informatik 2 Sommersemester 2013

Aufgabe 5.1 (Laboraufgabe, Nocheinmal ein wenig Graphik)

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Einführung in die Programmierung für Nebenfach Medieninformatik. Beat Rossmy, Michael Kirsch

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Hochschule Darmstadt Informatik-Praktikum WS 2017/2018 WIng Bachelor 6. Aufgabenblatt Zeiger, verkettete Liste, Dateieingabe und -ausgabe

Programmieren in Java

Klausur Grundlagen der Programmierung

7. Arrays. Beim Deklarieren und Initialisieren der Liste bräuchte man oft zueinander sehr ähnlichen Code:

JAVA für Nichtinformatiker - Probeklausur -

Anwendung Kamel-Simulation

Objektorientierte Programmierung Studiengang Medieninformatik

JAVA KURS COLLECTION

Vererbung. Generalisierung und Spezialisierung Vererbung und Polymorphismus

Graphische Benutzungsoberflächen mit Java. Einführung in NetBeans

Übungsblatt 1. Java Vorkurs (WS 2017)

Programmieren in Java -Eingangstest-

C++ - Objektorientierte Programmierung Konstante und statische Elemente

Java - AWT Basispraktikum SystemArchitektur WS 2008/ Atanas Dimitrov

Vorkurs Informatik WiSe 17/18

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)

Informatik I (D-MAVT)

C++ - Objektorientierte Programmierung Vererbung

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

Umsetzung einer Klassenkarte in einer Programmiersprache

Info B VL 8: Abstrakte Klassen & Interfaces

GUI Programmierung in Java

Graphic Coding. Klausur. 9. Februar Kurs A

3. Aufgabe: Bitmap-Datei

Abstrakte Klassen, Interfaces

Organisatorisches. drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

C++ - Objektorientierte Programmierung Konstruktoren und Destruktoren

Programmierung für Mathematik (HS13)

Informatik II Übung 06. Benjamin Hepp 5 April 2017

1 Modellierung einer Uhr

Grundlagen der Informatik

Listen. ArrayList. Definition Listen erzeugen Listen verändern Listen durchlaufen Listen sortieren. Dr. Beatrice Amrhein

DAP2-Programmierpraktikum Einführung in C++ (Teil 2)

Universität Paderborn Prof. Dr. Heike Wehrheim. Betreutes Arbeiten. Ab diese Woche: freitags, 14 16, E-Pool (während Tutorium Knopf) GPI, WS 07/08

Programmierstarthilfe SS 2008 Fakultät für Ingenieurwissenschaften und Informatik 8. Blatt Für den 16. und

5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!

Organisatorisches. Neue Übungsblätter: Nur mehr elektronisch? Abgabe Di, , 14 Uhr bis Do, , 8Uhr

Tutoraufgabe 1 (Seiteneekte):

Allgemeine Informatik II SS :30-13:30 Uhr

Einstieg in die Informatik mit Java

Konzepte objektorientierter Programmierung

Java Übung. Übung 3. Werner Gaulke. 2. Mai Universität Duisburg-Essen Kommedia, Übung EinPro SS06, Einführung in Java - Übung.

Programmierung für Mathematik (HS13)

Einstieg in die Informatik mit Java

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Algorithmen und Datenstrukturen

Android Programmierung. Studiengang MI

Hochschule Darmstadt Informatik-Praktikum WS 2017/2018 EIT Bachelor 5. Aufgabenblatt Datenstruktur, Dateieingabe und -ausgabe

Einstieg in die Informatik mit Java

Klausur Software-Entwicklung März 01

Ein String ist in Java eigentlich eine Klasse, wir können ihn aber zunächst als Datentyp betrachten, der zur Speicherung von Zeichenketten dient.

Einführung in die Programmierung für NF MI. Übung 07

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 08. Oktober Klausur II

1 Klassen anlegen und Objekte erzeugen

Hochschule Darmstadt Informatik-Praktikum SS 2017 EIT Bachelor 5. Aufgabenblatt Datenstruktur, Dateieingabe und -ausgabe

Informatik B. Vorlesung 14 Serialisierung, Autoboxing. Dr. Ralf Kunze

Algorithmen, Datenstrukturen und Programmieren I WS 2001/2002

Kapitel X - Zeichnen mit Java2D

Arbeitsblatt 5 EAD II NetBeans

Betreutes Programmieren Vorlesung Informatik II, Blatt 11

Name: Klausur Informatik III WS 2003/04

Transkript:

Hochschule Harz FB Automatisierung und Informatik 2. Labor: Grafische Nutzerschnittstellen mit Java Grafikdarstellung Thema:Anzeigen einer Grafikdatei Versuchsziele Vertiefung im Verständnis der JFrame-Programmierung, Benutzung von Klassen für die Grafikanzeige. Aufgabenstellung: Erweitern Sie das erste Labor. Das MyJInternalFrame soll die ausgewählte Datei über eine Klasse Middleware einlesen und über die Klasse Canvas darstellen. Abbildung 1 Musterlösung mit einigen JInternalFrames und deren Daten Wichtige Hinweise: In jedem JInternalFrame wird genau eine Datei dargestellt. Es werden nur vorhandene Dateien benutzt. Das New-File-Event wird nicht benötigt Das Open-File-Event gibt die ausgewählte Datei an das aktive Fenster. Das Save bzw. SaveAs-File-Event gibt es nicht Gesamte Musterlösung (inkl. 1. Labor): 1096 Zeilen Einiger vorhandener Quellcode muss geändert bzw. gelöscht werden 1

Aufgabenstellung: Entwickeln Sie ein Programm, welches Grafikdateien (*.grf) nach der unten aufgelisteten Spezifikation einliest und die darin gespeicherten Objekte auf einem Canvas eines JInternalFrames grafisch darstellt. Die Datei gliedert sich in zwei Teile. Der erste Teil besteht aus einem Kopfteil (Header), der zweite besteht aus den grafischen Elementen. In der Einleseroutine wird erst der Header gelesen und dann in einer Schleife die verschiedenen Objekte. Für jeden Datensatz muss ein passendes Objekt erzeugt werden und in ein internes Vectorfeld der Klasse Middleware eingetragen werden (Ein Beispiel ist vorgegeben). In der Paint-Methode der Klasse Canvas werden die Objekte gezeichnet. Die Klasse Canvas speichert nur die Grafikliste als Referenz. Für jedes grafisches Objekt ist eine eigene Klasse zu entwerfen (z. B. MyLine, MyCircle, MyTriangle, MyPolyline). Dabei sind sämtliche Attribute als privat zu deklarieren. Für die Aufgabe werden die benötigten Klassen in einer Rohform zur Verfügung gestellt. Weitere Information sind den Skripten bzw. den Beispieldateien zu entnehmen. Kommentierung Sie den Quelltext. Switch-Anweisungen müssen den default-fall abprüfen und mit einer Fehlermeldung abschließen (passive Programmierung). Wichtig: Fehlerhafte Dateien dürfen das Programm nicht zum Absturz bringen. Das Programm soll dann eine sinnvolle Fehlermeldung ausgeben. Dazu soll in der Klasse Middleware eine private Variable mit get-methode implementiert werden. Diese zeigt an, ob das Einlesen vollständig war. Sinnvoll wäre zum Beispiel ein String, der mit einem Fehlertext versehen werden kann. Diese Text könnte dann im Canvas angezeigt werden. Hinweis: Es gibt fehlerhafte Dateien, die auch abgefangen werden müssen! Inhalt der Beispieldateien: bsp01.grf Linie bsp02.grf Kreis bsp03.grf Kreis, Quadrat bsp04.grf Zwei Polylinien bsp05.grf zwei Dreiecke bsp06.grf Würfel bestehend aus 1 Rechteck, 2 Linien, 1 Polyline bsp07.grf zwei Rechtecke mit zwei Inkreisen bsp08.grf zwei Rechtecke mit Kreisen bsp09.grf 1000 Linien, jede einzeln eingebaut ;-) bsp10.grf Surprise ;-) bsperror1.grf bsperror2.grf bsperror3.grf Fehlerhafte Datei Fehlerhafte Datei Fehlerhafte Datei 2

Lösungen der mitgelieferten Dateien mit den Originalen Fenstergrößen: Ausgabe Datei bsp02.grf Ausgabe Datei bsp01.grf Ausgabe Datei bsp03.grf Ausgabe Datei bsp04.grf Ausgabe Datei: bsp05.grf Ausgabe Datei bsp06.grf 3

Ausgabe Datei bsp07.grf Ausgabe Datei bsp08.grf Ausgabe Datei bsp09.grf? Ausgabe Datei bsp10.grf Typen und Koordinaten der Beispiel-Dateien BSP01.grf Fenster: 300 x 250 Pixel (w/h) Linie: 10/80 bis 180/180 Farbe: rot Linienstärke: 2 BSP02.grf Fenster: 607 x 331 Pixel (w/h) Kreis: Mittelpunkt: 150/150 Radius: 120 Farbe: rot BSP03.grf Fenster: 300 x 330 Pixel (w/h) Rechteck: 40/40 bis 280/280 Farbe: 56564767 Kreis: Mittelpunkt: 160/160 Radius: 120 Farbe: rot 4

BSP04.grf Fenster: 400 x 430 Pixel (w/h) Polylinie: 40,100 140,100 140,200 40,200 Farbe: 3435 Polylinie: 70,270 100,300 130,270 160,300 190,270 210,300 240,270 Farbe: 33435 BSP05.grf Fenster: 500 x 530 Pixel (w/h) 1. Dreieck: 100,100 300, 100 200,300 Farbe: rot 2. Dreieck: 100, 250 300, 250 200,70 Farbe: blau BSP06.grf (Würfel) Fenster: 300 x 330 Pixel (w/h) Rechteck: 100/150 bis 200/250 Farbe: 0xFFF 1. Linie: 100/150 bis 171/79 Farbe: rot Polyline: 100/150 171/79 271/79 271/179 200/250 Farbe: 33435 2. Linie: 171/79 bis 171/150 Farbe: rot 3. Linie: 271/79 bis 200/150 Farbe: schwarz 5

BSP07.grf Fenster: 450 x 470 Pixel (w/h) Circle: 180/180, Radius 170 Farbe: rot Rectangle: 10/10 bis 350/350 Farbe: 56564767 Circle: 180/180, Radius 120 Farbe: rot Rectangle: 60/60 bis 180/180 Farbe: 156564767 BSP08.grf Fenster: 500 x 500 Pixel (w/h) Circle: 200/200, Radius 180 Farbe: rot Circle: 200/200, Radius 90 Farbe:schwarz Rectangle: 20/20 bis 200/200 Farbe: 56564767 Rectangle: 200/200 bis 380/380 Farbe: 56564767 BSP09.grf Fenster: 500 x 500 Pixel (w/h) 1000 Linien mit Zufalls-Koordinaten und Zufalls-Farben BSP10.grf: Surprise Fenster: 500 x 500 Pixel (w/h) Circle: 250/250, Radius 200 Farbe: blau Rectangle: 120/150 bis 220/175 Farbe: Grün Rectangle: 190/150 bis 390/175 Farbe: Grün etc. BSPError1.grf Fehlerhafter Dateikennung BSPError2.grf Fehlerhafter Header, Version ist 2 BSPError3.grf Fehlerhafter Header, negative Abmessungen 6

Aufbau der Datei Die Java-Dateien haben folgenden Aufbau: Open-File-Event Create JInternalFrame Create Middleware, jede grf-datei hat ihre eigene Middleware readfile Read Header (loadfromdata) Read Objekte (loadfromdata) Show Windows readfile in der Klasse Middleware Read Header Read Objekt-Kennung, korrekter Typ? While(...) { Read Objekt-Kennung, korrekter Typ? Create Objekt Read Objekt Insert Objekt Read Objekt-Kennung, korrekter Typ? } paint.routine in MyCanvas For all Objekte in _liste { Referenziere Objekt g.draw ( ) } Klasse Header Private Attribute Set / get -Methoden loadfromdata(... ) Klasse Linie Private Attribute loadfromdata(... ) draw( ) etc. 7

Überblick über alle Klassen Klasse MDI-Hauptframe Labor1.java (JFrame) Deklaration der Variablen setgui o Verhindern, dass die Menüs nicht sichtbar sind o Eintragen in der Methode setgui NEU setdefaultlightweightpopupenabled(false); actionperformed newfile o Datei Öffnen mittels eines FileChoosers o Erzeugt einen MyInternalFrames (Parameter sfilename). Der Dateiname wird in der Titelzeile angezeigt. o Eintragen in das DesktopPane o Aufruf der Methode setgrafiksize (NEU) openfile o Neue Auswahl mittels eines FileChoosers o Der Dateiname wird dem aktuellen Fenster übergeben (Parameter sfilename) und in der Titelzeile angezeigt o Aufruf der Methode setgrafiksize (NEU) Klasse MyInternalsFrame Deklaration der Variablen o private sfilename bitte LÖSCHEN, ist in Middleware o private Middleware _middleware; o private MyCanvas _canvas; Konstruktor o Initialisieren der Variablen o Erstellen einer Instanz der Klasse Middleware Middleware erhält den Dateinamen setgui o Layout setzen o Canvas erzeugen und einfügen in das Layout o Die Klasse Canvas erhält einen zusätzlichen Parameter (Middleware middleware) public setgrafiksize // neu o setzen der Größe nach dem Lesen. Diese Methode muss nach dem Eintragen in das DesktopPane aufgerufen werden. Sonst wird die Originalgröße aus der grf-datei nicht gesetzt. JInternalFrame-Optionen: setclosable(true); seticonifiable(true); setmaximizable(true); setresizable(true); Klasse Middleware Deklaration der Variablen o private ArrayList _grafikliste Typisiert wäre besser ;-) o private String _sfilename; o private int height=0; o private int width=0; 8

Konstruktor o Initialisieren der Variablen private readfile(string sfilename o Öffnen der Datei o Lesen des Headers o Speichern der Abmessungen o Irgendetwas mit der Grafikliste machen o Lesen der Grafikdaten bis zum letzten Datensatz (Typ=0) Abfragen des Typs Erzeugen des Grafiktyps Lesen des Grafiktyps, aber nicht hier Einfügen o Schließen des Dateikanals (fin) Klasse MyCanvas Löschen des Default-Konstruktors Erstellen eines Konstruktors mit einem Parameter der Klasse Middleware o Aus dem Parameter Middleware die Liste holen und global speichern Speichern des Parameters in einer globalen Variablen der Klasse Überschreiben der Methode void paint (Graphics g) o Aufruf von super.paint super.paint(g); // Neu o Einen weißen Hintergrund erstellen o Aus der Liste die grafischen Elemente holen Canvas-Optionen: setcolor( color) fillrect(x,y, width, height) drawline(x1,y1, x2,y2) Optional: Graphics2D g2 = (Graphics2D) g; float[] dash = { 20, 10 }; // new float[]{ 20,10 } BasicStroke stroke = new BasicStroke( 12, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 1, dash, 10 ); g2.setstroke( stroke ); Strichdicke für Linien: Graphics2D g2 = (Graphics2D) g; g2.setstroke( new BasicStroke(strichstaerke) ); g.drawline(10,10, 300,400) ; Klasse MyHeader Löschen des Default-Konstruktors Implementieren der Methode loadfromdata o Lesen der Magic-Number o Lesen und speichern der Versionsnummer o Lesen und speichern der Breite o Lesen und speichern der Höhe 9

Klasse MyGrfObject Hat folgende Methoden o draw(graphics g); o loadfromdata(datainputstream DataIn) throws IOException; Außerdem müssen noch einige Wörter in die Klasse eingefügt werden Klasse MyLine Erstellen der privaten Attribute Implementieren der abstrakten Methoden o loadfromdata Lesen von x1, y1, x2, y2 Lesen von color (int) Lesen der Linienstärke (linewidth) o draw setzen der Farbe setzen der Linienstärke zeichnen der Linie Klasse MyCircle Erstellen der privaten Attribute Implementieren der abstrakten Methoden o loadfromdata Lesen von x, y, radius Lesen von color (int) o draw setzen der Farbe zeichnen des Kreises Klasse MyRect Erstellen der privaten Attribute o Width und Height dürfen nicht als Attribute verwendet werden. Implementieren der abstrakten Methoden o loadfromdata Lesen von x1, y1, x2, y2 Width und Height dürfen nicht als Attribute verwendet werden. Lesen von color (int) o draw setzen der Farbe zeichnen des Rechteckes Klasse MyTriangle Erstellen der privaten Attribute Implementieren der abstrakten Methoden o loadfromdata Lesen von x1, y1, x2, y2, x3, y3 Lesen von color (int) o draw setzen der Farbe setzen der drei einzelnen Linien 10

Klasse MyPolyline Erstellen der privaten Attribute o Farbe o Array von x o Array von y Implementieren der abstrakten Methoden o loadfromdata Lesen der Anzahl der Koordinaten Irgendetwas erzeugen Lesen der Koordinaten Lesen der Farbe o draw setzen der Farbe zeichnen der Polyline Versuchsdurchführung Alle Klassen erstellen: 1) Eintragen in der Methode setgui: setdefaultlightweightpopupenabled(false); 2) Erstellen der Klasse Middleware. Ein Rahmen ist als Txt-Datei vorhanden. Bitte benutzen. 3) Erstellen der Klasse Kostanten. Ein vollständiger Rahmen ist als Txt-Datei vorhanden. Bitte benutzen. 4) Erstellen der Klasse MyHeader. Ein Rahmen ist als Txt-Datei vorhanden. Bitte benutzen. 5) Erstellen der Klasse MyGrfObject. Ein Rahmen ist als Txt-Datei vorhanden. Bitte benutzen. 6) Erstellen der grafischen Klassen. Ein jeweiliger Rahmen ist als Txt-Datei vorhanden. Bitte benutzen. Modifikation des Quellcode: 7) Klasse Middleware Löschen Sie das Attribut sfilename in der Klasse MyJinternalFrame. Einbau der Klasse Middleware als Attribut. Verknüpfen der Attribute canvas und middleware. Im Konstruktor muss der Dateiname gesetzt werden. Im Konstruktor muss die Datei durch die Klasse Middleware gelesen werden. Implementierung der Methode setgrafiksize. Einbau des Aufrufs der Methode setgrafiksize nach dem Einfügen des MyJInternalFrames. 11

8) Klasse Header Einbau der Attribute. Einbau der set- und get-methoden. Implementierung der Methode loadfromdata Eingelesen werden dürfen die Daten des Headers nur in der Methode loadfromdata( ). Im Konstruktor darf das Einlesen nicht stattfinden. o Lesen der Magic-Number o Lesen der Version o Lesen der Breite und Höhe o Test der Attribut auf Korrektheit 9) Klasse Middleware Implementierung der Methode loadfromdata o Öffnen der Datei o Lesen des Headers o Ausgabe von Testdaten mittels syso 10) Klasse MyJInternalFrame Implementierung der Methode setfilename o In der Middleware setzen des Dateinamens o Titel setzen o Lesen der Datei o Fenstergröße setzen 11) Klasse MyGrfObject Verändern des Quellcodes, so dass die Klasse sinnvoll genutzt werden kann. 12) Klasse MyLine Einbau der Attribute. Kein Einbau von set- und get-methoden. Implementierung der Methode loadfromdata Eingelesen werden dürfen die Daten nur in der Methode loadfromdata( ). Im Konstruktor darf das Einlesen nicht stattfinden. o Lesen der vier Koordinaten o Lesen der Farbe als int-wert o Lesen der Strichstärke (int Implementierung der Methode draw o Setzen der Farbe o Casten des g auf Graphics2D o Setzen der Strichstärke o Zeichnen der Linie 13) Test mit der ersten Datei bsp01.grf Fenster: 300 x 250 Pixel (w/h) Linie: 10/80 bis 180/180 Farbe: rot Linienstärke: 2 14) Vervollständigen Sie die weiteren Grafik-Klassen. Entwickeln Sie insbesondere die Methoden loadfromdata( ) und draw Eingelesen werden die Daten der Grafikelemente nur in den jeweiligen Klassen resp. in der Methode loadfromdata( ). Nicht im Konstruktor! Implementieren Sie die Grafikausgabe in der Methode paint() des Canvas. Jedes Objekt muss mit der Methode draw(g) gezeichnet werden. 12

Hinweise: Erste Tests können mit den Dateien (bsp01.grf bis bsp04.grf) durchgeführt werden. Für die Fehlerprüfung werden die Dateien (bsp06.grf und bsp07.grf) verwendet. Falls ein Fehler beim Einlesen der Datei auftritt, soll der Anwender durch die eine Fehlerausgabe im Dos-Fenster benachrichtigt werden (Syso). Lesen Sie alle geometrischen Objekte aus der Datei und speichern Sie diese im privaten Objekt. Fügen Sie das neue Objekt dann in die Liste. Verwenden Sie für die Unterscheidung der Grafiktypen die vorhandenen Konstanten. Zum Bestehen des Labors müssen alle vorgegebenen Dateien ohne Absturz funktionieren. Hinweise: a) Verwenden Sie nur Standardjava. b) Farben Die gespeicherten Farben entsprechen einem RGB-Wert (32-Bits). Das Objekt Color wird durch folgenden Konstruktor erzeugt: Beispielcode: Color c; int rgbwert = 255; c = new Color(rgbwert) ); c) Paint-Methode Durch das Eintragen in die Liste kann es vorkommen, dass beim ersten Zeichnen nicht alle Elemente dargestellt werden. Nachdem Einlesen sollte man deshalb das Canvas sich neu zeichnen lassen. Dazu gibt es die Methode updateui. 13

Aufbau der Dateien: Aufbau des Headers: Byte Bedeutung Erläuterung 0-1 Dateikennung KI (KommunkationsInformatik) K=75 I=73 2-3 Version 1 4-7 Breite der Grafik Bedingung: Breite > 0 8-11 Höhe der Grafik Bedingung: Höhe> 0 Definition der Konstanten: 1: Linie x1, y1, x2, y2, Farbe, Linienstärke 2: Rechteck x1, y1, x2, y2, Farbe 3: Kreis x1, y1, Radius, Farbe 4: Dreieck x1, y1, x2 y2, x3, y3, Farbe 5: Polylinie x1, y1,, xn, yn, Farbe Schema der Speicherung der Objekte: Header Kennung des 1. Objektes (2 Byte) Datensatz des 1. Objektes Kennung des 2. Objektes (2 Byte) Datensatz des 2. Objektes Kennung des 3. Objektes (2 Byte) Datensatz des 3. Objektes Kennung des n. Objektes (2 Byte) Datensatz des n. Objektes Kennung 0 DATENSATZENDE 14

Definition der Linie (MyLine): Bytes Type 0-1 Kennung (1) 2-5 x1 6-9 y1 10-13 x2 14-17 y2 18-21 Farbe 22-25 Strichstärke Definition des Rechtecks (MyRect): Bytes Type 0-1 Kennung (2) 2-5 x1 6-9 y1 10-13 x2 14-17 y2 18-21 Farbe Definition des Kreises (MyCircle): Bytes Type 0-1 Kennung (3) 2-5 x 6-9 y 10-13 Radius 14-17 Farbe Definition des Dreiecks (MyTriangle): Bytes Type 0-1 Kennung (4) 2-5 x1 6-9 y1 10-13 x2 14-17 y2 18-21 x3 22-26 y3 27-30 Farbe 15

Definition der Polylinie (MyPolylinie): Bytes Type 0-1 Kennung (5) 2-5 Anzahl der Koordinaten (0 bis beliebig) 6-9 x1 10-13 y1 14-17 x2 18-21 y2 22-25 x3 26-29 y3 30-33 x3 34-37 y3 etc. 38-41 Farbe Grafikfunktionen in Java: Methode drawline() drawoval() drawpolyline drawrect() setcolor() Beschreibung: zeichnet eine Gerade void drawline(int x1, int y1, int x2, int y2) zeichnet eine Ellipse void drawoval(int x, int y, int width, int height) zeichnet ein Linie mit mehreren Punkten (Array) void drawpolyline(int [] xpoints, int [] ypoints, int anz) zeichnet ein Rechteck void drawrect(int x, int y, int width, int height) legt die Zeichnungsfarbe fest void setcolor(color c) void setcolor( new Color(int) ) Zusätzliche Grafikbefehle (für Klasse MyLine): Dickere Linie: Graphics2D g2 = (Graphics2D) g; g2.setstroke( new BasicStroke(4.0f) ); 16

Beispiele: Einlesen eines double-wertes: FileInputStream Fin; DataInputStream Din; double d; try { Fin = new FileInputStream(sFileName); Din = new DataInputStream(Fin); } d = Din.readDouble(); Din.close(); catch (IOException ee) { System.err.println("IOException: " + ee); } Einlesen eines integer-wertes: FileInputStream Fin; DataInputStream Din; int i; try { Fin = new FileInputStream(sFileName); Din = new DataInputStream(Fin); i = DataIn.readInt(); Din.close(); } catch (IOException ee) { System.err.println("IOException: " + ee); } 17

Klasse ArrayList: Die Klasse Vector speichert beliebige Objekte in einer Liste (Vergleichbar mit einem dynamischen Array). Methoden des Objektes Vector: add(object) get (i) size() clear() Trägt ein Objekt in die Liste ein Gibt das i-te Element aus der Liste aus. Der Index zählt von 0 bis n-1!! Gibt die Anzahl der Elemente aus Löscht alle Elemente in der Liste Deklaration und Erzeugen eines Vector: ArrayList liste1 = new ArrayList (); // speichert beliebige Objekte ArrayList <Circle> liste2 = new ArrayList <Circle>(); // speichert nur Kreise Element aus der Liste holen: Object obj = liste1.elementat(2); Circle c = (Circle) obj; // Cast Circle c = liste2.get(2); // automatischer Cast möglicher Beispielquellcode: MyLine linie; // speichert ein Linienobjekt MyLine linie2; // Zwischenspeicher für ein Linienobjekt MyCircle kreis; // speichert ein Kreisobjekt MyCircle kreis2; // Zwischenspeicher für ein Kreisobjekt Object obj; // Zwischenspeicher für die Liste ArrayList liste; // Deklaration linie=new MyLine(); kreis = new MyKreis(); liste = new Vector(); liste.add(linie); liste.add(kreis); // Vector wird erzeugt // Objekt vom Typ MyLine wird in die Liste eingetragen // Objekt vom Typ MyCircle wird in die Liste eingetragen for (int i=0; i<liste.size(); i++) { Object obj = liste.get(i); // weitere Verarbeitung } 18