49 2 Den Code richtig organisieren In diesem Kapitel diskutieren wir zunächst den Umgang mit den verschiedenen Elementen der Benutzeroberfläche: Editoren, Betrachtern und Perspektiven. Anschließend behandeln wir die grundlegenden Ressourcentypen: Projekte, Verzeichnisse und Dateien. Dann wenden wir uns wieder der Java-Programmierung zu. Diesmal geben wir »Hello World« nicht auf der Konsole aus, sondern über die Soundkarte! Dabei behandeln wir Themen wie den Import und Export von Dateien und Archiven, das Assoziieren von Quelldateien zu Binärdateien und die richtige Einstellung der Projekteigenschaften. 2.1 Die Workbench Wie schon in der Einführung erwähnt, ist das Java IDE nur eines von vielen Plug-ins für die Eclipse-Workbench. Insofern ist die EclipseWorkbench völlig unabhängig von Java. Schalten wir also einmal aus der Java-Perspektive zurück in die Ressourcen-Perspektive (Abbildung 2.1). Dort, wo in der Java-Perspektive der Package-Explorer zu sehen war, sehen wir nun den Navigator. Die einzelnen Packages sind verschwunden, stattdessen sehen wir eine Struktur geschachtelter Verzeichnisse. Abb. 2-1 Der Navigator zeigt Projekte, Verzeichnisse und Dateien. Wir haben hier schon etwas vorgegriffen: Das dargestellte Projekt wird erst in Kapitel 3 entwickelt. 50 2 Den Code richtig organisieren 2.2 Ressourcen Der Navigator der Eclipse-Workbench zeigt einen Überblick über die von der Eclipse-Workbench verwalteten Ressourcen und gestattet die Navigation in der Menge der Ressourcen. 2.2.1 Ressourcentypen Die Workbench kennt drei verschiedene Ressourcentypen: ❑ Projekte. Ein Projekt bildet jeweils das Wurzelverzeichnis für einen Verzeichnisbaum. Projekte können Verzeichnisse und Dateien enthalten. ❑ Verzeichnisse. Verzeichnisse können andere Verzeichnisse und Dateien enthalten. Verzeichnisse können beliebig tief geschachtelt werden. ❑ Dateien. Dateien bilden die Endpunkte von Ressourcenbäumen, d.h., eine Datei enthält keine weiteren Ressourcen. 2.2.2 Wo Ressourcen gespeichert werden Alle Ressourcen werden direkt im Dateisystem des ausführenden Computers gespeichert. Dies ist anders als bei VisualAge, wo die Ressourcen der Workbench in einem Repository gespeichert waren. Bei Eclipse entspricht jedoch die Struktur aus Projekten und Verzeichnissen direkt einer entsprechenden Verzeichnisstruktur auf dem ausführenden Computer. Das hat Vorteile bezüglich Crash-Sicherheit und Datensicherung. Der Speicherort für die Ressourcen der Workbench ist standardmäßig das Verzeichnis \eclipse\workspace. Hier ist jedes Projekt in einem entsprechenden Unterverzeichnis enthalten. So ist beispielsweise die Ressource BaseSynthesizer.java im Pfad \eclipse\workspace\DukeSpeaks\ com\sun\speech\enginge\synthesis\BaseSynthesizer.java gespeichert. Freilich lässt sich das Workspace-Verzeichnis mit Hilfe des Kommandozeilen-Parameters -data auch an anderen Orten einrichten, so z.B. mit eclipse.exe -data C:\myOldWorkSpace 2.2.3 Ressourcen synchronisieren Refresh Gelegentlich kommt es vor, dass der Zustand der Dateien in \eclipse\ workspace nicht dem Kenntnisstand von Eclipse entspricht, denn Eclipse speichert Metadaten über die Ressourcen der Workbench im Verzeich- 2.2 Ressourcen nis \eclipse\workspace\.metadata. Wurde jedoch eine Datei der Workbench an Eclipse vorbei verändert, z.B. durch die Anwendung eines externen Werkzeugs, so kann es passieren, dass die Metadaten in .metadata nicht mehr mit dem aktuellen Zustand einer Ressource übereinstimmen. Das ist nicht weiter schlimm. In diesem Fall führt man eine Synchronisierung auf die betroffene Ressource durch. Man selektiert die betroffene Ressource im Navigator und wendet die Kontextfunktion Refresh an. Übrigens lässt sich diese Funktion nicht nur auf einzelne Dateien, sondern auch auf ganze Verzeichnisse oder Projekte anwenden. 2.2.4 Navigation Die folgenden Kontextfunktionen stehen im Kontextmenu des Navigators für die Navigation zur Verfügung: ❑ Go into. Diese Funktion reduziert die aktuelle Sicht auf den Inhalt des ausgewählten Projekts oder Verzeichnisses. Wenn man Tausende von Ressourcen in der Workbench hat, weiß man diese Funktion zu schätzen. ❑ Go to>Back. Wechselt zur vorigen Sicht. Diese Funktion ist auch in der Toolbar des Navigators enthalten (Pfeil nach links). ❑ Go to>Forward. Macht Go to>Back wieder rückgängig. Diese Funktion ist auch in der Toolbar des Navigators enthalten (Pfeil nach rechts). ❑ Go to>One level up. Geht ins nächst höhere Verzeichnis. Diese Funktion ist auch in der Toolbar des Navigators enthalten. ❑ Go to>Resource. Bietet eine alphabetische Auswahlliste von Res- sourcen und springt dann zur ausgewählten Ressource. ❑ Open in new Window. Wirkt wie die Funktion Go into, nur dass ein weiteres Fenster (mit einer kompletten Workbench!) geöffnet wird, bei der nur der Inhalt des ausgewählten Projekts oder Verzeichnisses im Navigator gezeigt wird. Das Menü der Toolbar (unter dem kleinen Dreieck) bietet noch einige zusätzliche Funktionen: ❑ Mit der Sort-Funktionen können die Dateien nach Name oder Typ sortiert angeordnet werden. ❑ Mit der Filters...-Funktion können Dateien mit bestimmten Datei- erweiterungen aus dem Navigator ausgeblendet werden. 51 52 2 Den Code richtig organisieren 2.3 Öffnen mit ... Neue Assoziation festlegen Assoziationen Der Typ einer Datei wird aus der Dateierweiterung bestimmt. In Abbildung 2.1 sehen wir textbasierte Dateien wie die .java- und .htmlDateien und die Datei Makefile, aber auch binäre Dateien wie die .class-Dateien. Dateierweiterungen bestimmen, was geschieht, wenn eine Datei geöffnet wird. Wenn wir z.B. eine .java-Datei mit der rechten Maustaste anklicken, so erhalten wir ein Pop-up mit den Kontextfunktionen. Wählen wir dort das Untermenü Open with ..., erhalten wir ein weiteres Popup mit Editoren. Im ersten Abschnitt sehen wir den für diese Datei aktiven Editor (normalerweise den Java-Editor). Im zweiten Abschnitt sehen wir alle für diesen Dateityp registrierten Editoren, darunter auch Text Editor und System Editor. Der Texteditor ist der im Eclipse SDK enthaltene Texteditor. Dieser kann für alle textbasierten Dateien benutzt werden. Der Systemeditor ist der Editor, der auf dem ausführenden Betriebssystem für den jeweiligen Dateityp registriert ist. Eclipse kann derartige externe Editoren aus der Workbench heraus starten: Öffnen wir beispielsweise eine HTML-Datei, wird ein Webbrowser gestartet. Im Wesentlichen werden diese Dateiassoziationen (welcher Editor mit welchem Dateityp) von den in Eclipse installierten Plug-ins bestimmt. Es ist jedoch auch möglich, manuell solche Assoziationen hinzuzufügen. Hierzu ruft man die Funktion Window>Preferences>File Associations auf. Im oberen Fenster sieht man nun eine Liste der registrierten Dateierweiterungen. Mit Hilfe der Add- und Remove-Buttons kann man neue Dateierweiterungen hinzufügen oder löschen. Im unteren Fenster erscheinen die registrierten Editoren für die gerade selektierte Dateierweiterung. Auch hier können Editoren hinzugefügt oder gelöscht werden. Mit dem Default-Button kann ein bestimmter Editor zum Standardeditor erklärt werden. Drückt man den Add-Button, so erhält man zunächst eine Liste der internen, in Eclipse installierten Editoren. Markiert man das Feld External Programs, erhält man die Liste der im ausführenden Betriebssystem registrierten Programme (siehe Abbildung 2.2). Durch einen Doppelklick auf eines dieser Programme wählt man es als neuen Editor aus. 2.4 Packages Abb. 2-2 So können Dateiassoziationen definiert werden. Hier haben wir zunächst die Dateierweiterung *.html hinzugefügt und assoziieren dann Microsoft Frontpage mit diesem Dateityp. 2.4 Packages Schalten wir wieder zurück in die Java-Perspektive, ergibt sich ein anderes Bild. Der Package-Explorer zeigt die verschiedenen Projekte mit ihrer Package-Struktur und den Kompiliereinheiten. 2.4.1 Verzeichnisse und Packages Packages sind keine realen Ressourcen, sondern virtuelle Objekte. Die Package-Struktur eines Projekts ergibt sich aus den package-Deklarationen am Beginn jeder Java-Quelldatei. Die Java-Spezifikation verlangt allerdings, dass sich die PackageStruktur isomorph auf eine Verzeichnisstruktur abbilden lässt. So müssen – wie in Abbildung 2.3 gezeigt – alle Ressourcen des Package com.sun.speech.engine.text im relativen Pfad com/sun/speech/engine/text gespeichert sein. In Eclipse ist diese Pfadangabe immer relativ zum Quelltext-Wurzelverzeichnis für das Projekt. Der relative Pfad com/sun/ speech/engine/text entspricht daher dem physischen Pfad \eclipse\ workspace DukeSpeaks\com\sun\speech\engine\text. 53 54 2 Den Code richtig organisieren Abb. 2-3 Jedes Package kann eindeutig auf einen Knoten im Verzeichnisbaum abgebildet werden. Kompiliereinheiten im Package-Explorer können dagegen aus mehreren Ressourcen bestehen: aus einer Quelldatei und einer oder mehrerer Binärdateien. Im Falle der Klasse AnimatedAudioPlayer gibt es zwei Binärdateien – eine für AnimatedAudioPlayer selbst und eine für die innere Klasse JavaClipLineListener. 2.4.2 Navigation Der Package-Explorer verfügt über ähnlich Navigationsfunktionen wie der Navigator (siehe Abschnitt 2.2.4). So gibt es auch hier die Kontextfunktionen Go into und Open in new Window, in der Toolbar gibt es Buttons für die Funktionen Go to>Back, Go to>Forward und Go to>One level up. Zusätzlich lässt sich die Ansicht auf ein Working Set (eine vom Benutzer definierte Auswahl von Ressourcen) beschränken. Wichtig ist auch die Taste Link with Editor (links neben dem Dropdown-Menü). Ist sie gedrückt, ist der Package-Explorer immer mit dem jeweils aktiven Editor synchronisiert, d.h., bei einem Wechsel zwischen Editoren wechselt auch die Selektion im Package-Explorer entsprechend. Außerdem besteht noch die Möglichkeit, den Browser für die Typenhierarchie zu öffnen. 2.4.3 Hierarchie Die Typhierarchie zeigt die Super- und Subtypen für Klassen und Interfaces an. Dabei besteht die Möglichkeit, entweder die Sicht nur auf Super- oder Subtypen zu beschränken oder die komplette Hierarchie anzuzeigen. Mit der History-Funktion kann man rasch zwischen den verschiedenen Sichten wechseln oder vorher angezeigte Hierarchien noch einmal anzeigen (Abbildung 2.4). 2.5 Der Outline-View Abb. 2-4 Der Hierarchie-Browser besteht aus zwei Fenstern. Im oberen Fenster wird die Typenhierarchie angezeigt, im unteren Fenster werden die Felder und Methoden des selektierten Typs angezeigt. In der Toolbar des unteren Fensters findet man einige weitere Funktionen. Der erste Button verändert das obere Fenster und zeigt dort nur die Typen an, die das im unteren Fenster selektierte Feld bzw. die selektierte Methode implementieren. Der zweite Button bewirkt, dass im unteren Fenster auch die ererbten Methoden und Fenster des aktuellen Typs angezeigt werden. Die restlichen Buttons verhalten sich wie die entsprechenden Buttons des Outline-Fensters (siehe nächster Abschnitt). Der Hierarchie-Browser erweist sich insbesondere dann als nützlich, wenn man vorhandene Projekte oder Bibliotheken analysieren will. Beim Erstellen eines neuen Projektes wird man ihn in der Regel erst bei fortgeschrittenem Projektstand benötigen. 2.5 Der Outline-View Der Outline-View (Abbildung 2.5) gestattet die Navigation innerhalb einer Quelldatei. Generell ist der Outline-View nicht auf Java-Programme beschränkt, sondern steht – je nach installierten Plug-ins – auch für andere Dateitypen zur Verfügung. 55 56 2 Den Code richtig organisieren Bei Java-Programmen stellt der Outline-View sowohl die Felder und Methoden als auch die import-Anweisungen dar. Sind innere Klassen definiert, werden auch diese Klassen dargestellt: Die Hauptklasse und die inneren Klassen bilden eine Baumstruktur. Durch einen einfachen Klick auf ein im Outline-View dargestelltes Feld oder eine Methode wird der Editor auf die Definition des Feldes bzw. der Methode positioniert. Darüber hinaus gibt es noch eine Reihe weiterer nützlicher Funktionen. Doch beginnen wir mit der Darstellung der Felder und Methoden im Outline-View. 2.5.1 Darstellung Abb. 2-5 Die verschiedenen Buttons der Outline-Toolbar erlauben es, bestimmte Elemente aus dem Outline-View herauszufiltern. Mit dem Sortieren-Button können Felder und Methoden alphabetisch geordnet werden (andernfalls gilt die Reihenfolge in der Quelldatei). 2.5 Der Outline-View 57 Das erste Icon vor einem Eintrag im Outline-View kennzeichnet die Art des Eintrags (Package, import-Anweisung, Interface, Klasse, Methode, Feld) und die Sichtbarkeit (public, protected, private). import-Anweisung Icons Interface Klasse öffentliche Methode (public) geschützte Methode (protected) private Methode (private) Standardmethode (ohne Modifikation) öffentliches Feld (public) geschütztes Feld (protected) privates Feld (private) Standardfeld (ohne Modifikation) Zusätzlich zu diesem ersten Icon können noch weitere Icons angezeigt werden: Konstruktor statisches Element (static) unveränderbares Element (final) überschriebenes Element Die Darstellung des Outline-Views kann über Window>Preferences>Java>Appearance beeinflusst werden: ❑ Show method return types. Zeigt den Ergebnistyp von Methoden im Outline-View an. ❑ Show override indicators... Zeigt den -Indikator für überschrei- bende Methoden an. ❑ Show member in Package Explorer. Ist diese Option gesetzt, so erscheinen Methoden und Felder auch im Package-Explorer als Kindelemente von Klassen und Interfaces. Die meisten Funktionen des Outline-View stehen dann auch dort zur Verfügung. 2.5.2 Kontextfunktionen Im Outline-View gibt es eine Reihe von Kontextfunktionen. Die wichtigsten sind auch auf der Toolbar des Outline-View als Buttons vorhanden (siehe Abbildung 2.5). Hier ist eine Übersicht über die vorhandenen Kontextfunktionen: 58 2 Den Code richtig organisieren ❑ Open Type Hierarchy. Zeigt die Typenhierarchie für das ausge- wählte Element (siehe Abschnitt 2.4.3). Diese Funktion kann nicht nur auf einzelne Typen, sondern auch auf ganze Packages oder Projekte angewandt werden. ❑ Open Supertype Implementation. Diese Funktion erscheint nur bei überschreibenden Elementen. Bei Ausführung der Funktion wird das überschriebene Element im Editor geöffnet. ❑ Show in Package Explorer. Synchronisiert den Package-Explorer mit dem ausgewählten Element im Outline-View. ❑ Cut, Copy, Paste, Delete. Die üblichen Kopier- und Löschfunktio- nen, angewandt auf das im Outline-View ausgewählte Element. ❑ Refactor>... Verschiedene Funktionen zum Umorganisieren von Code (siehe Abschnitt 1.8.2) ❑ Add JavaDoc Comment. Fügt einen JavaDoc-Kommentar zum selektierten Element hinzu (siehe Abschnitt 1.6.3). ❑ Generate Getter and Setter. Diese Funktion erscheint nur bei Typen mit Feldern und erlaubt die Erzeugung von Zugriffsmethoden (siehe Abschnitt 1.6.3). ❑ References>... Sucht nach Verweisen auf das selektierte Element (siehe nächster Abschnitt). ❑ Definitions>... Sucht nach Definitionen des selektierten Elements (siehe nächster Abschnitt). ❑ Read Access>... Sucht nach Lesezugriffen auf das selektierte Feld (siehe nächster Abschnitt). ❑ Write Access>... Sucht nach Schreibzugriffen auf das selektierte Feld (siehe nächster Abschnitt). ❑ Add/Remove Watchpoint. Diese Funktion erscheint nur bei Feldern und gehört zum Instrumentarium des Debuggers (siehe Kapitel 4). ❑ Add/Remove Method Breakpoint. Diese Funktion erscheint nur bei Methoden und gehört zum Instrumentarium des Debuggers (siehe Kapitel 4). ❑ Compare With>..., Replace With>..., Restore from Local History... Mit diesen Funktionen kann die aktuelle Version mit früheren Versionen zu verglichen bzw. durch frühere Versionen ersetzt werden (siehe Abschnitt 1.10). 2.6 Suchen 2.6 Suchen 2.6.1 Die Suchfunktion Die Eclipse-Suchfunktion besteht aus zwei Komponenten: dem Dialogformular zur Eingabe der Suchkriterien (Abbildung 2.6) und der Tabelle der Suchergebnisse (Abbildung 2.7). Abb. 2-6 Der Dialog für die Suchkriterien besitzt mehrere Seiten, abhängig von den installierten Plug-ins. Hier haben wir eine Seite für die generelle Suche nach Dateien, die einen Suchbegriff enthalten, eine Seite für die Suche nach Hilfebegriffen, eine Seite für die Java-spezifische Suche (geöffnet) und eine Seite für die Suche nach Plug-ins. Suchkriterien Wird die Suchfunktion von der Toolbar der Eclipse-Workbench oder aus dem Eclipse-Hauptmenü heraus aufgerufen, so erscheint zunächst der Dialog für die Spezifikation der Suchkriterien. Beim Aufruf über eine Kontextfunktion unterbleibt dieser Schritt, da die Suchkriterien schon feststehen. Bei der Java-Suche kann als Suchbegriff der Name eines Typs, einer Methode, eines Package, eines Konstruktors oder eines Felds eingegeben werden. Dabei lässt sich der Name ganz oder nur teilweise qualifizieren. Zusätzlich kann die Suche eingeschränkt werden. Man kann nur nach Deklarationen oder nur nach Verweisen suchen bzw. nach beiden. Bei Feldern kann die Suche auf Lese- oder Schreibzugriffe beschränkt werden. Der Suchbereich lässt sich auf selektierte Ressourcen oder auf Working Sets (benannte Ressourcenmengen) beschränken. 59 60 2 Den Code richtig organisieren Neben der Java-Suche gibt es im Suchdialog weitere Seiten für die Suche nach Texten in allgemeinen Ressourcen, für die Suche im Hilfesystem und für die Suche nach Plug-ins. Mit der Customize-Taste kann man einzelne Seiten des Suchdialogs aus- bzw. einblenden. Suchergebnisse Die Ergebnisse der Suche werden im Search-View dargestellt, der in der Standard-Java-Perspektive den Tasks-View überdeckt. Abb. 2-7 Der Search-View zeigt alle Kompiliereinheiten, in denen der Suchbegriff gefunden wurde. Die Anzahl der Vorkommen wird hinter jedem Eintrag in Klammern angegeben, wenn der Suchbegriff mehrfach in einer Einheit erscheint. Ein Doppelklick auf einen Eintrag öffnet die entsprechende Kompiliereinheit im Editor. Mit den Abwärts- und Aufwärts-Pfeilen in der Toolbar des SearchViews kann man bequem die einzelnen Fundstellen aufsuchen, die entsprechende Kompiliereinheit wird dabei automatisch im Editor geöffnet. In der linken Randzeile des Editors werden Zeilen mit Treffern der Suchanfrage mit einem gelben Pfeil gekennzeichnet. Der Search-View speichert auch vorhergehende Suchergebnisse. Mit den entsprechenden Buttons (oder auch mit dem Menü des SearchViews) kann man deshalb auch auf die Ergebnisse früherer Suchanfragen zurückgreifen. 2.6.2 Finden und Ersetzen Neben der oben diskutierten Suchfunktion gibt es natürlich auch eine Editorfunktionen zum Suchen und Ersetzen von Zeichenketten. Mit der Funktion Edit>Find/Replace erhält man einen Dialog (siehe Abbildung 2.8) zur Eingabe von Suchbegriffen und verschiedenen Suchoptionen. Ist beim Aufruf dieser Funktion bereits eine Zeichenkette selektiert, so wird diese Zeichenkette als Suchbegriff übernommen. 2.7 Editoren und Views anordnen Abb. 2-8 Der Find/Replace-Dialog erlaubt es, Zeichenketten zu suchen und ggf. durch andere Zeichenketten zu ersetzen. Bei der Suche besteht die Möglichkeit, vorwärts oder rückwärts zu suchen und die Suche nur auf die selektierten Zeilen zu beschränken. Daneben gibt es noch einige weitere Optionen: ❑ Case Sensitive. Ist dieses Feld markiert, so wird die Groß- und Kleinschreibung bei der Suche berücksichtigt. ❑ Wrap Search. Ist dieses Feld markiert, beginnt die Suche am Ende des Suchbereichs (bzw. am Anfang wenn rückwärts gesucht wird) wieder von vorne. Anderenfalls erfolgt eine Fehlermeldung. ❑ Whole Word. Ist dieses Feld markiert, werden nur ganze Wörter gesucht. ❑ Incremental. Ist dieses Feld markiert, so beginnt die Suche sofort bei der Eingabe des ersten Buchstabens. Bei Eingabe weiterer Buchstaben wird ggf. weitergesucht. Entsprechend zu diesen Optionen stehen zusätzlich zu Edit>Find/Replace weitere spezialisierte Suchfunktion zur Verfügung: Edit>Find Next, Edit>Find Previous, Edit>Incremental Find. Außerdem gibt es noch die Funktion Edit>Go to line ..., mit der man durch Eingabe einer Zeilennummer zur spezifizierten Zeile springen kann. 2.7 Editoren und Views anordnen Die Anordnung der verschiedenen Fenster in der Eclipse-Workbench ist nicht fest vorgegeben, sondern mit Einschränkungen frei konfigurierbar. Dabei gibt es im Wesentlichen drei verschiedene Organisationsprinzipien: 61 62 2 Den Code richtig organisieren Fenster andocken ❑ Anordnung der Fenster neben- bzw. übereinander wie in Abbildung 2.9. Alle Fenster sind gleichzeitig sichtbar. Man kann ein Fenster an ein anderes Fenster andocken, indem man es bei der Titelleiste oder beim Reiter packt und an den jeweiligen Rand des Zielfensters zieht. Erscheint ein Pfeilsymbol, lässt man es los. Gestapelte Fenster ❑ Mehrere Fenster können in einem Stapel angeordnet werden. Jeweils mit einem Druck auf einen Reiter kann ein Fenster im Stapel nach oben gebracht werden und wird damit sichtbar. Man kann ein Fenster auf andere Fenster stapeln, indem man es bei der Titelleiste oder beim Reiter packt und auf das Zielfenster zieht. Erscheint ein Stapelsymbol, lässt man es los. FastView ❑ Im so genannten FastView kann ein Fenster auf die linke Randzeile der Workbench (unter den Perspektiv-Ikonen) minimalisiert werden: Es wird nur noch als ein Ikon repräsentiert. Ein Klick auf das Ikon und es wird erneut sichtbar, ein weiter Klick und es verschwindet wieder. Man kann ein Fenster in einen FastView verwandeln, indem man es bei der Titelleiste oder beim Reiter packt und auf den linken Rand der Workbench zieht. Erscheint ein Stapelsymbol, lässt man es los. Abb. 2-9 Hier haben wir den Search-View auf den rechten Rand des Tasks-View gezogen. Nun erscheinen beide Views nebeneinander. 2.8 Perspektiven verwalten Selbstverständlich kann man jedes Fenster durch einen Klick auf das Kreuz in der rechten oberen Ecke des Fensters schließen. Doch wie öffnet man es wieder? 63 Fenster öffnen und schließen ❑ Bei Editoren ist das einfach: Ein Doppelklick auf die entsprechende Ressource im Navigator oder Package-Explorer öffnet die Ressource im jeweiligen Editor. ❑ Etwas komplizierter ist es bei Views. Hier benutzt man die Funk- tion Window>Show View>... , in der man dann den zu öffnenden View auswählt. Alle Fenster der Workbench sind maximierbar. Ein Doppelklick auf die Titelleiste eines Views bzw. den Reiter eines Editors maximiert das betreffende Fenster, d.h., das Fenster nimmt allen Raum in der Workbench ein. Andere Fenster sind dann nicht mehr sichtbar. Ein weiterer Doppelklick stellt den alten Zustand wieder her. 2.8 Perspektiven verwalten Eine Perspektive ist eine bestimmte Konfiguration von Editoren, Views und Menüs in der Workbench. In diesem Kapitel haben wir bereits die Ressource-Perspektive und die Java-Perspektive kennen gelernt. In Kapitel 4 werden wir dazu noch die Debug-Perspektive kennen lernen. 2.8.1 Neue Perspektiven definieren Nehmen wir an, Sie haben nun alle Fenster der Java-Perspektive entsprechend Ihren Vorlieben und Bedürfnissen angeordnet wie in Abbildung 2.9. Gibt es eine Möglichkeit, diese Einstellungen zu speichern? Ja, und zwar mit der Funktion Window>Save Perspective As... (Abbildung 2.10). Hier können Sie die aktuelle Konfiguration unter einem von Ihnen vergebenen Namen als neue Perspektive speichern. Falls Sie später zu dieser Konfiguration zurückkehren wollen, können Sie das entweder mit der Funktion Window>Reset Perspective oder mit den Funktionen Window>Close Perpective und Window>Open Perspective... erreichen. Fenster maximieren 64 2 Den Code richtig organisieren Abb. 2-10 Die in Abbildung 2.9 veränderte Workbench-Konfiguration speichern wir hier als neue Perspektive unter dem Namen Java (Tasks neben Search) ab. 2.8.2 Perspektiven konfigurieren Mit Hilfe der Funktion Window>Customize Perspective können bestimmte Aspekte der aktuellen Perspektive geändert werden. Dazu gehören: ❑ Die Dateitypen, die im Untermenü File > New zur Verfügung ste- hen. ❑ Die Perspektiven, die im Untermenü Window > Open Perspective zur Verfügung stehen. ❑ Die Views, die im Untermenü Window > Show View zur Verfügung stehen. ❑ Die Action Sets (Buttons und Menüfunktionen), die auf der Work- bench-Toolbar bzw. im Workbench-Menü erscheinen (Abbildung 2.11). 2.9 Dateien importieren Abb. 2-11 Mit der Funktion Window>Customize Perspective können ganze Funktionsgruppen (Action Sets) aus einer Perspektive herausgenommen bzw. neue Funktionsgruppen hineingenommen werden. Auf der rechten Seite ist aufgelistet, welche Funktionen die selektierte Funktionsgruppe (hier Java Coding) umfasst. Daneben gibt es unter Window>Preferences>Workbench>Perspectives die Möglichkeit festzulegen, ob neu geöffnete Perspektiven innerhalb der aktuellen Workbench oder in einem neuen Workbench-Fenster geöffnet werden. Diese letzte Option macht jedoch nur Sinn bei einem sehr großen Bildschirm. Bei kleineren Bildschirmen wird man die Eclipse-Workbench bildschirmfüllend einsetzen. Die Perspektive-Icons auf der linken Randleiste der Workbench sind dann das geeignete Mittel für einen Perspektivwechsel. Eine weitere Option erlaubt es, beim Neuanlegen eines Projektes auch gleichzeitig eine neue Perspektive (im gleichen oder einem neuen Workbench-Fenster) anzulegen. So könnte jedes Projekt eine eigens auf es zugeschnittene Perspektive erhalten. 2.9 Dateien importieren Wir gehen nun daran, unserem HelloWorld-Programm das Sprechen beizubringen. Seit Version 1.4 enthält Java auch eine Sprachschnittstelle, das Java Speech API (JSAPI). Dazu gibt es die kostenlose Referenzimplementierung FreeTTS, die wir uns aus dem Internet herunterladen können. FreeTTS hat seine Wurzeln im Sprachsynthesizer Flite, wurde aber komplett nach Java portiert. Interessant dabei ist, dass FreeTTS 65 66 Fremdsoftware importieren 2 Den Code richtig organisieren erheblich schneller abläuft als Flite. Java scheint also auch in Sachen Geschwindigkeit C++ immer mehr Konkurrenz zu machen. FreeTTS (Version 1.1.1) findet man unter http://sourceforge.net/ projects/freetts. Nach dem Download der etwa 26 MB großen Datei (also ein Fliegengewicht im Vergleich zur Eclipse SDK Distribution) entpackt man diese in ein beliebiges Verzeichnis. Außerdem muss noch das JSAPI (Java Speech API) entpackt werden, da es einem anderen Lizenzmodell unterliegt. Dazu führen wir einfach das Programm jsapi.exe im Ordner FreeTTS\lib aus. Man kann nun der FreeTTS-Installationsanleitung folgen und FreeTTS ausprobieren. Das lassen wir aber bleiben und gehen daran, das System direkt nach Eclipse zu importieren. Zunächst legen wir uns ein neues Java-Projekt namens FreeTTS an. Dieses Projekt halten wir selektiert und rufen mit der Kontextfunktion Import ... den Import-Wizard auf. Im folgenden Dialog sehen wir eine Liste möglicher Importquellen. Dort wählen wir Filesystem aus und drücken den Next-Button. Im nun erscheinenden Dialog drücken wir den Browse-Button und navigieren bis zum Ordner ...\FreeTTS\demo\JSAPI\HelloWorld. Dieser Ordner erscheint nun im linken Fenster des Dialogs. Wir selektieren ihn und sehen auf der rechten Seite alle Dateien in diesem Ordner, wie in Abbildung 2.12 gezeigt. Dort machen wir ein Häkchen an HelloWorld.java und drücken den Finish-Button. Abb. 2-12 Importieren aus einem Dateisystem. Im Feld Directory enthält die Dropdown-Liste alle bisher verwendeten Import-Quellen, sodass man sich langwieriges Suchen oft ersparen kann. 2.9 Dateien importieren Wenn alles richtig gelaufen ist, müsste nun das importierte Programm HelloWorld.java ein Default-Package im Projekt FreeTTS sein (Abbildung 2.13). Doch, oh weh, jede Menge Fehlermeldungen! Abb. 2-13 Nach dem Import. Die importierte Datei wurde sofort kompiliert, was zu einer Menge offener Verweise führte. Natürlich – das FreeTTS-Laufzeitsystem fehlt noch. Wir haben zwei Möglichkeiten: ❑ Wir importieren auch die JAR-Dateien des Laufzeitsystems in den Workspace. Damit koppeln wir uns aber von Versionswechseln ab. Neue Versionen der JAR-Dateien müssten dann ggf. neu in den Workspace importiert werden. ❑ Wir fügen die JAR-Dateien als externe Dateien dem Java Build Path zu. Das erspart uns den Import dieser Dateien. So vermeiden wir das doppelte Vorhalten dieser Archivdateien. Werden diese Dateien durch neue Versionen ersetzt, werden die Änderungen auch sofort für unser Projekt wirksam. 67 68 2 Den Code richtig organisieren 2.10 Der Java Build Path Projekteigenschaften Wir entscheiden uns bei diesem Beispiel für die zweite Möglichkeit. Um JAR-Dateien dem Java Build Path hinzuzufügen, rufen wir die Funktion Project>Properties und dann Java Build Path... auf und gehen zur Seite Libraries. Hier sehen wir nur einen einzigen Eintrag, nämlich das Java-1.4-Laufzeitsystem rt.jar. Wir drücken die Taste Add External Jars und navigieren zum Ordner ...\FreeTTS\lib. Von den nun aufgelisteten JAR-Dateien (cmuawb.jar, ..., JSAPI.jar) selektieren wir alle (demo.jar können wir weglassen) und drücken dann den Öffnen-Button. Die so ausgewählten JAR-Dateien werden nun der Libraries-Liste hinzugefügt (Abbildung 2.14). Dann drücken wir noch den Ok-Button und harren der Dinge, die da kommen. Alle Fehlermeldungen sind verschwunden! Abb. 2-14 Die Libraries-Seite der Projekteigenschaften nach dem Einfügen der FreeTTS-Jars. Was uns noch fehlt, ist der Quellcode der FreeTTS-Binärdateien. Dieser Code ist im Archiv src.zip in der FreeTTS-Distribution enthalten. Wir müssen diese Datei lediglich den entsprechenden Packages des FreeTTS-Projektes zuordnen. Und das geschieht so: 2.11 Die Java Browsing-Perspektive 69 Für das Package freetts.jar wählen wir die Kontextfunktion Properties. In den dann erscheinenden Package-Eigenschaften wählen wir Java Source Attachment. Dann drücken wir auf die Taste External File und navigieren zur Datei src.zip. Und das war's auch schon. Öffnen wir nun eine Datei aus freetts.jar, so erscheint der zugehörige Quellcode im Editor. Freilich sind diese Dateien nicht editierbar, sondern dienen lediglich der Ansicht. Eigentlich können wir das Programm nun ausprobieren. Wir führen es mit demselben Kommando wie schon unser erstes HelloWorldProgramm aus: Run>Run as>Java Application. Statt der versprochenen Sprachausgabe erhalten wir aber nur folgenden Text auf der Konsole: Can't find synthesizer. Make sure that there is a "speech.properties" file at either of these locations: user.home : H:\Dokumente und Einstellungen\Berthold Daum java.home/lib: C:\j2sdk1.4.0\jre\lib Richtig, davon war ja in der FreeTTS-Installationsanweisung die Rede. Wir kopieren die Datei speech.properties aus ...\FreeTTS in eines der genannten Verzeichnisse und führen dann unser Programm erneut aus. Es ertönt: Hello, World! Vorausgesetzt freilich, Ihr Computer hat eine Soundkarte (oder Sound on Board) und Sie haben einen Lautsprecher angeschlossen ... 2.11 Die Java Browsing-Perspektive Die Java Browsing-Perspektive (Abbildung 2.15) erlaubt eine etwas andere Sicht auf die Struktur eines Java-Projektes. Wir können diese Perspektive einfach durch einen Druck auf die Taste »Neue Perspektive« (siehe Abschnitt 1.2) und entsprechende Auswahl anlegen. Kein Bild, kein Ton ... 70 2 Den Code richtig organisieren Abb. 2-15 Die Java Browsing-Perspektive erlaubt in den oberen vier Fenstern die hierarchische Auswahl von Projekten, Packages, Typen und Methoden bzw. Feldern. Da man leicht zwischen dieser Perspektive und der normalen Java-Perspektive hin und her wechseln kann, ist diese Perspektive ein gutes Hilfsmittel, um den Überblick über ein Projekt nicht zu verlieren.
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
advertisement