Benutzungsoberflächen

Größe: px
Ab Seite anzeigen:

Download "Benutzungsoberflächen"

Transkript

1 Benutzungsoberflächen Skript V0.3 vom Prof. Dr.-Ing. Holger Vogelsang SWT/JFace und RCP

2 Don t panic

3 Inhaltsverzeichnis 1 Einleitung Organisation der Vorlesung Vorbereitungen Kassifikation von Anwendungen Einteilung nach Architekturen Einteilung nach Zielplattformen Übersicht Architekturen von Fat-Client-Anwendungen Interaktionseigenschaften SWT und JFace Grundlagen Layout-Management SWT-Widgets Menüs und Toolbar-Leisten Basisklassen Ereignisbehandlung Model-View-Controller mit JFace Weitere Container Anbindung an die Geschäftslogik Deklarative Beschreibungen Eclipse Rich Client Platform Multithreading in Java Threads erzeugen und starten Threads beenden und löschen Zugriff auf gemeinsam genutzte Ressourcen Synchronisation von Threads Threads als Daemons

4 Inhaltsverzeichnis 8 Abbildungsverzeichnis Literaturverzeichnis Stichwortverzeichnis 114

5 1 Einleitung Diese Veranstaltung behandelt grafische Benutzungsoberflächen auf Basis der Eclipse Rich Client Platform. Ergonomische Aspekte werden nicht betrachtet, da es zu diesem Thema eine eigenständige Vorlesung gibt. 1.1 Organisation der Vorlesung Neben der Klausur kann auch eine Programmieraufgabe gelöst werden. Durch Abgabe einer korrekten Lösung erhalten Sie Bonuspunkte für die Klausur. Nähere Informationen sind auf der Webseite zur Vorlesung im Ilias unter dem FAQ zu finden. 1.2 Vorbereitungen Installation des JDK unter Windows Zur reinen Ausführung von Java-Programmen genügt das JRE (Java Runtime Environment). Darin fehlen aber beispielsweise wichtige Werkzeuge wie der Compiler. Hier in der Vorlesung sollen eigene Programme erstellt werden. Daher muss das JDK (Java Development Kit, manchmal auch SDK genannt) verwendet werden Integrierte Entwicklungsumgebungen Die Anwendung des nackten JDKs ist nicht sehr komfortabel. Daher bietet sich die Verwendung einer integrierten Entwicklungumgebung an. Da in der Vorlesung die Eclipse Rich Client Platform eingesetzt wird, bietet es sich an, Eclipse auch als IDE zu verwenden. Bitte wählen Sie auf den Pool-Rechnern als Projektverzeichnis ein Verzeichnis auf dem Netzlaufwerk. Zur lokalen Installation auf einem privaten Rechner laden Sie von die Version Eclipse for RCP and RAP Developers herunter. Sie beinhaltet bereits alle notwendigen Plugins für die Vorlesung. Die ZIP-Datei wird einfach in ein eigenes Verzeichnis extrahiert. Damit Sie später die Oberflächen nicht manuell erstellen müssen, bietet sich die Verwendung eines GUI-Editors an. Eclipse liefert mit dem VEP (Visual Editor Plugin) eine eigene Implementierung, die aber nicht immer im neuesten Eclipse funktionsfähig ist. Statt dessen kann für private Zwecke der Jigloo GUI-Editor (http://www.cloudgarden.com/jigloo/) oder noch besser

6 1.2 Vorbereitungen der WindowBuilder Pro (http://code.google.com/webtoolkit/tools/wbpro/ index.html) von Google als Eclipse-Plugin bezogen werden. Auf den Seiten befinden sich auch die Installationsanleitungen Eclipse Rich Client Platform Im Laufe der Vorlesung wird sich zeigen, dass die Eclipse Rich Client Platform am besten separat installiert wird. Dazu wird unter downloads/ die Eclipse-Version ausgewählt (am besten Latest Release ) und auf der folgenden Seite das Platform SDK für die verwendete Betriebssystem-Version. Bitte achten Sie darauf, dass inzwischen neben 32-Bit- auch 64-Bit-Betriebssysteme unterstützt werden. Wählen Sie Variante, die zu Ihrer installierten Java-Version passt. Die Plattform wird ebenso wie die IDE in ein Verzeichnis entpackt. Es darf sich dabei nicht um dasselbe Verzeichnis wie die IDE handeln Aufbau dieses Skriptes Das Skript beinhaltet eine Einführung in alle wichtigen Themen, die zur Lösung der Aufgabe notwendig sind. Weiterhin betrachtet es viele Beispiele ausführlicher als die PowerPoint-Unterlagen der Vorlesung. So wird beispielsweise im Skript deutlich mehr Bezug auf das verwendete API genommen. 1. Einleitungskapitel: Dieses lesen Sie jetzt gerade. 2. Klassifikation von Anwendungen: Wie unterscheiden sich Anwendungen, bezogen auf die Benutzungsoberfläche? 3. Einführung in SWT: Hier finden Sie eine Einführung in SWT, die alle wichtigen Konzepte vorstellt. Parallel dazu sollten immer sowohl die JDK-Dokumentation als auch die Online-Hilfe aus Eclipse griffbereit sein. 4. Einführung in JFace: JFace setzt auf SWT auf und bietet eine höhere Abstraktion von den einzelnen Fensterelementen. So wird beispielsweise das MVC-Muster unterstützt. 5. Anbindung an die Geschäftslogik: Dieses Kapitel beschreibt die Trennung von Anwendungslogik und Benutzungsoberfläche. 6. Deklarative Beschreibungen: Hier wird gezeigt, wie sich Oberflächen deklarativ mit XML-Dialekten beschrieben lassen. 7. Rich Client Platform: Es wird die Idee des Frameworks vorgestellt. Am Ende des Dokumentes befindet sich in Kapitel 7 noch eine Einführung in das Multithreading unter Java. Abgeschlossen wird das Skript mit einem Abbildungs-, Literatursowie einem Stichwortverzeichnis. 6

7 2 Kassifikation von Anwendungen Anwendungen lassen sich sehr unterschiedlich in Kategorien einteilen. Da wir uns mit grafischen Benutzungsoberflächen befassen, erfolgt hier zunächst die Einordnung anhand der Architekturmerkmale für die Oberflächenkonstruktuktion. 2.1 Einteilung nach Architekturen In der Literatur sind die verwendeten Begriffe nicht so einheitlich zu finden, wie es die Aufstellung hier vermuten lässt Thin Client Es handelt sich dabei beispielsweise um eine Ajax-Anwendung, die in einem Browser ausgeführt wird. Charakteristisch sind: Start über eine URL Eine lokale Installation auf dem Client ist nicht erforderlich, da ein halbwegs aktueller Browser immer vorhanden sein sollte. Die Geschäftslogik befindet sich überwiegend auf dem Server. Die Kommunikation erfolgt nach dem Request/Response-Prinzip. Somit kann nur der Client den Server kontaktieren. Inzwischen existieren auch neuere Ansätze (z.b. mit Apache Comet), die es erlauben, den Client auch vom Server aus zu kontaktieren. Browser (HTML, JavaScript) Server (Application-Server, Datenbank, ) Abbildung 2.1: Kommunikation bei einem Thin-Client

8 2.1 Einteilung nach Architekturen Rich Thin Client Die Anwendung läuft wie bei einem Thin Client im Browser ab. Allerdings wird hier nicht mehr auf die reinen Browser-Techniken gesetzt. Statt dessen führt ein Plugin im Browser die Anwendung aus. Dabei kann es sich beispielsweise um Java-Applets oder Flash- Programme handeln. So stehen wesentlich mächtigere Sprachmittel als bei reinen Thin Clients zur Verfügung. Eigenschaften: Start über eine URL Eine lokale Installation auf dem Client ist nicht erforderlich. Das Plugin kann automatisch durch den Browser nachinstalliert werden Die Geschäftslogik befindet sich überwiegend auf dem Server. Die Kommunikation erfolgt auch hier in der Regel nach dem Request/Response- Prinzip. Browser (HTML, JavaScript, Flash, Applet) Server (Application-Server, Datenbank, ) Abbildung 2.2: Kommunikation bei einem Rich Thin Client Rich Fat Client Ein Rich Fat Client (oder auch kurz Rich Client) ist eine Anwendung, die großenteils auf dem Client abläuft. Sie basiert auf einer Plattform wie z.b. Eclipse RCP oder NetBeans Platform. Merkmale: Es ist eine lokale Installation auf dem Client erforderlich. Java bietet mit Java Web Start einen eleganten Mechanismus, die Java-Anwendung durch einen Browser nachzuinstallieren. Damit ist nur noch die manuelle Einrichtung eines JRE auf dem Client erforderlich. Die Plattform kann zusätzliche Module vom Server nachladen. Weiterhin bieten viele Plattformen auch einen automatischen Update-Mechanismus, indem sie in bestimmten Abständen den Server nach neuen Modulversionen befragen und diese herunterladen. Die Geschäftslogik kann sich auf Client und Server befinden. Die Kommunikation zwischen Client und Server findet entweder nach dem Request/- Response-Prinzip oder aber wirklich bidirektional statt. 8

9 2.2 Einteilung nach Zielplattformen Client (Eclipse RCP, ) Server (Application-Server, Datenbank, ) Abbildung 2.3: Kommunikation bei einem Rich Fat Client Smart Client Der Begriff des Smart Clients ist häufig im Microsoft-Umfeld zu finden. Er bezieht sich fast immer auf Anwendungen, die auf.net, ASP.NET, XAML usw. basieren. Eigenschaften: Der Start der Anwendung erfolgt aus dem Browser heraus über eine URL. Somit ist keine lokale Installation erforderlich. Die Geschäftslogik kann sich auf Client und Server befinden Fat Client (plattformunabhängig) Hierbei handelt es sich um eine klassische Desktop-Anwendung. Sie wird beispielsweise in Java mit Swing oder SWT bzw. in C++ mit QT usw. erstellt. Wichtig ist also, dass sowohl die verwendeten Bibliotheken als auch der eigentliche Quelltext plattformunabhängig sind. Damit ist die Anwendung auf binärer Ebene zwar nicht direkt auf allen unterstützten Plattformen ausführbar, aus dem Quelltext lässt sich aber durch einfaches Übersetzen auf einer anderen Zielplattform ein lauffähiges Programm erzeugen. Charakteristisch sind: Der Start erfolgt lokal auf dem Client. Dazu ist auch eine lokale Installation erforderlich. Die Geschäftslogik ist überwiegend auf dem Client, teilweise aber auch auf dem Server vorhanden Fat Client (plattformabhängig) Prinzipiell gelten dieselben Aussagen wie für den plattformunabhängigen Fat Client. Als Besonderheit kommt aber hinzu, dass plattformabhängige Bibliotheken verwendet werden. So könnte die Benutzungsoberfläche mit Hilfe der MFC-Klassen von Microsoft erstellt worden sein, für die es keine entsprechende Implementierung auf anderen Systemen gibt. 2.2 Einteilung nach Zielplattformen Neben den klassischen Desktop-PCs und Laptops gibt es eine Reihe weiterer Hardwareplattformen, die eine Anwendung unterstützen kann. Mobile Geräte: Diese besitzen unterschiedliche Betriebssysteme wie Windows CE/- Mobile, Symbian OS, Google Android, ios usw. 9

10 2.4 Architekturen von Fat-Client-Anwendungen Unterschiedliche Leistungen: Nicht alle Geräte haben genügend Speicher oder ausreichend leistungsfähige Prozessoren. Auch die Größen der Displays können sich signifikant unterscheiden: Normale mobile Telefone, Smartphones, PDAs, Tablet- PCs, usw. Unterschiedliche Programmierumgebungen: Es gibt nicht auf allen Geräten einheitliche Entwicklungssprachen und -umgebungen: Java ME, C++, C#, usw. 2.3 Übersicht Die folgende Tabelle stellt die Vor- und Nachteile der verschiedenen Architekturen einander gegenüber. Die Einteilung ist nicht vollständig. Tabelle 2.1: Architekturvergleich Thin Client (Ajax) Rich Thin Client (Browser + Plugin) Rich Fat Client (Java) Microsoft Smart Client Java Fat Client Windows oder LinuX Fat Client Installation / 1 Administration / 2 Wartung (SW) Interaktion Performance GUI-Konsistenz Plattformunabh Arbeit bei Serverausfall ++ / 3 ++ / 3 ++ / 3 Applikationslogik Server Server Client und Server Client und Server überwiegend auf dem Client überwiegend auf dem Client 2.4 Architekturen von Fat-Client-Anwendungen Eine Fat-Client-Anwendung besteht typischerweise aus mehreren Schichten, von denen hier nur einige betrachtet werden sollen: Hardware: Diese Schicht beinhaltet die eigentliche Ein- und Ausgabehardware, über die mit der Anwendung kommuniziert wird. Betriebssystem: Das Betriebssystem greift über Gerätetreiber auf die Hardware zu und abtrahiert gleichzeitig von ihr. Das Fenstersystem wird häufig als Bestandteil des Betriebssystems angesehen. Es nutzt die Abstraktionen von der Hardware, um den Anwendungen Fenster zur Darstellung von Inhalten sowie Interaktionen mit den Fenstern anzubieten. 1 Eventuell notwendige Installation einer Laufzeitumgebung 2 Eventuell notwendige Einrichtung einer Laufzeitumgebung 3 Hängt von der Konzeption ab 10

11 2.4 Architekturen von Fat-Client-Anwendungen Benutzungsschnittstelle (Struktur): Sie ist für die Darstellung und Verwaltung des Inhalts in den Fenstern verantwortlich. Sie übernimmt auch die Anordnung der einzelnen Fensterelemente (z.b. Widgets) untereinander. Dialogsteuerung, Ein- und Ausgabe von Daten: Diese Schicht kontrolliert die Aktionen des Benutzers in Bezug auf deren Plausibilität. Sie prüft beispielsweise, ob gewisse Eingaben sinnvoll und korrekt sind. Weiterhin steuert sie die Benutzungsschnittstelle und die Geschäftslogik in der übergeordneten Schicht, indem sie auch die Daten in der Oberfläche und Geschäftslogik synchronisiert und Ereignisse weitermeldet. Anwendungskern (Geschäftslogik): Hier befindet sich die eigentliche Funktionalität der Anwendung. Sie wird teilweise von der Dialogsteuerung aufgerufen, wenn Ereignisse eingetreten sind. Anwendungskern (Geschäftslogik) Dialogsteuerung, Ein-/Ausgabe von Daten Benutzungsschnittstelle (Struktur) Vorlesungsinhalt Fenstersystem (Präsentation) Betriebssystem Tastaturtreiber Maustreiber Grafiktreiber Hardware Abbildung 2.4: Architektur einer Fat-Client-Anwendung Die Vorlesung beschäftigt sich im Wesentlichen mit der Dialogsteuerung sowie der Struktur der Benutzungsschnittstelle. Zusätzlich wird mit der Eclipse Rich Client Platform ein Framework betrachtet, das ein Gerüst für eine Fat-Client-Anwendung vorgibt. 11

12 2.5 Interaktionseigenschaften Das folgende Beispiel soll die einzelnen Schichten verdeutlichen: Struktur (Widgets und deren Anordnung) Geschäftslogik (Datum kleiner als aktuelles Datum) Ein- und Ausgabe (Daten aus dem Dialog) Präsentation (Farben, Zeichensätze,...) Dialogsteuerung (entsperrt, wenn die Eingaben in Ordnung sind, löst Aktion aus) public class Customer { private String firstname; private String lastname; private int customernumber; private boolean retired; private FamilyStatus familystatus; private Date customersince; //... Abbildung 2.5: Architekturschichten anhand eines Beispiels Durch die Struktur wird beschrieben, wie die einzelnen Widgets untereinander platziert sind und wie sich sich bei einer Größenänderung des Dialogs verhalten sollen. Das Aussehen der Widgets und der Fenster wird von der Präsentationsschicht des Fenstersystems übernommen. So kann ein einheitliches Erscheinungsbild aller Anwendungen in einem Fenstersystem erzielt werden. Die Eclipse Rich Client Platform zusammen mit SWT und JFace erlaubt, wie andere Toolkits auch, das Aussehen und Verhalten in gewissen Grenzen zu ändern. Die Dialogsteuerung kann beispielsweise die OK-Taste erst dann freigeben, wenn alle Eingaben in Ordung sind. Weiterhin löst sie durch einen Druck auf die Taste Aktionen aus. Die Dialogsteuerung kann nicht immer alle Eingaben selbst validieren, weil ihr dazu häufig Informationen fehlen, die nur in der Geschäftslogik zu finden sind. In dem Beispiel muss das eingegebene Datum bestimmte Bedingungen erfüllen, die von der Geschäftslogik festgelegt sind. Die im Dialog dargestellten oder veränderten Daten müssen der Geschäftslogik zur Verfügung gestellt werden bzw. stammen von ihr. Diese uni- oder bidirektionale Kommunikation wird von der Ein- und Ausgabeschicht übernommen. Im diesem Beispiel beinhaltet eine Java-Klasse die Daten des Dialogs. 2.5 Interaktionseigenschaften Ein Benutzer kann mit der Anwendung auf vielfältige Varianten kommunizieren, wenn diese das unterstützt: 1. Menü-Auswahl: Steuerung der Anwendung erfolgt durch Menü-Kommandos. 12

13 2.5 Interaktionseigenschaften 2. Formular-basiert: Die Daten werden in Formulare eingegeben. Diese Variante ist besonders gut für einfach strukturierte Daten geeignet. 3. Direkte Manipulation: Die Bearbeitung von Objekten erfolgt auf einer Arbeitsfläche durch Drag-und-Drop, kontextsensitive Menüs usw. Beispiele sind Drag-und Drop für Dateioperationen, UML-Editoren und Zeichenprogramme. Dafür gibt es bereits eine ganze Anzahl von Java-Bibliotheken wie Naked Objects nakedobjects.org/ und Eclipse GEFhttp://www.eclipse.org/gef/. 4. Sprachgesteuerte Interaktionen (natürliche Sprache, anwendungsspezifische Sprache): Dazu gehören Anweisungen auf der Kommandozeile, in Anwendungen eingebettete Skriptsprachen sowie die Erkennung gesprochener Befehle. In dieser Vorlesung spielen nur die Punkte 1 und 2 sowie etwas von Punkt 3 und 4 eine Rolle. 13

14 3 SWT und JFace Dieses Kapitel beschäftigt sich mit dem Standard Widget Toolkit ( SWT ) sowie dem darauf aufsetzenden JFace, die beide zur Gestaltung der Benutzungsoberflächen verwendet werden. Anwendungskern (Geschäftslogik) Dialogsteuerung, Ein-/Ausgabe von Daten Benutzungsschnittstelle (Struktur) Vorlesungsinhalt Fenstersystem (Präsentation) Betriebssystem Tastaturtreiber Maustreiber Grafiktreiber Hardware Abbildung 3.1: Struktur der Oberfläche Warum werden hier aber gerade SWT und JFace verwendet? Es gibt ja auch Swing, das plattforumabhängig und im JDK schon enthalten ist, QT, Windows-Forms, und viele andere Toolkits. Zur Beantwortung der Frage ist zunächst ein Blick auf die Eigenschaften von SWT und JFace erforderlich: SWT wurde als Basis für die Entwicklung von Eclipse geschaffen.

15 3.1 Grundlagen SWT verwendet denselben Ansatz wie das Abstract Window Toolkit (AWT). Dabei werden native Dialogelemente des Fenstersystems verwendet, soweit diese denn vorhanden sind. Ansonsten zeichnet SWT sie selbst. Somit gibt es innerhalb von SWT eine Bibliothek, die plattformabhängig ist. Die Programmierschnittstelle selbst ist plattformunabhängig. JFace bildet eine Abstraktionsschicht von SWT, indem es für viele Elemente den MVC-Ansatz anbietet und teilweise die Ereignisbehandlung vereinfacht. Darüber hinaus besitzt es eine Registry für Zeichensätze, Farben und Bilder sowie vordefinierte Dialoge und Wizards. Die folgende Aufstellung fasst die Vor- und Nachteile von SWT und JFace zusammen. + Native Dialogelemente sind häufig schneller als selbst gezeichnete. Sie passen sich auch der Darstellung des Fenstersystems an. Somit sieht eine SWT-Anwendung genauso aus wie jede andere Anwendung des Fenstersystems. + SWT hat innerhalb der Eclipse Rich Client Platform inzwischen einen Einzug in die Industrie gehalten. + Viele allgemeine Konzepte für Benutzungsoberflächen lassen sich anhand von SWT und JFace beispielhaft aufzeigen. + Es gibt hervorragende Entwicklungsumgebungen und Modellierungswerkzeuge, die teilweise kostenlos verfügbar sind. + Mit Hilfe der Rich Ajax Platform ( RAP ) lassen sich aus bestehenden Fat-Clients relativ einfach Web-Anwendungen (Rich Thin Clients) erzeugen. + Es sind viele Erweiterungen verfügbar (z.b. GEF für grafische Editoren,... ). - Die Programmierschnittstelle des SWT ist teilweise nicht sehr objekt-orientiert ausgelegt. Insbesondere die häufige Verwendung von Konstanten statt zusätzlicher Klassen ist störend. - Es sind nicht so viele mächtige Dialogelemente wie in Swing vorhanden. - Teilweise ist keine Garbage-Collection möglich. Als Folge daraus müssen Betriebssystemressourcen manuell freigegeben werden. - Es werden keine Applets unterstützt. Das ist kein großer Mangel, da Applets in letzter Zeit immer seltener eingesetzt werden. Da SWT plattformabhängig ist, werden nicht automatisch alle Java-Plattformen unterstützt. Allerdings wurde SWT auf praktisch alle relevanten Fenstersysteme portiert: Windows 32 und 64 Bit: XP, Vista, 7 Linux 32 und 64 Bit: x86 (GTK), x86 (Motif), PPC (GTK), S390 (GTK) Solaris: x86 (GTK), Sparc (GTK) AIX: PPC (Motif) HP-UX: ia64 (Motif) Mac OS X: Carbon, Cocoa Verschiedene eingebettete Geräte (im Rahmen von ercp) Anmerkung: Sie finden die Quelltexte aller Beispiele als Download auf der Homepage. In jedem Beispiel ist der Name der Quelltextdatei im Archiv angegeben. 15

16 3.1 Grundlagen 3.1 Grundlagen Dieser Abschnitt beschreibt die SWT-Grundlagen. Dazu gehören die Platzierung von GUI-Elementen ( Widgets ) durch so genannte Layout-Manager sowie die allgemeine Verwendung der Widgets Die erste SWT-Anwendung Um einen ersten Eindruck vom Aufbau einer reinen SWT-Anwendung zu vermitteln, zeigt das folgende Beispiel ein kleines Programm, das nur einen Text in einer Taste darstellt (Quelltextdatei FirstSWTApplication.java). Die Seitenzahlen dienen nur der späteren Erklärung des Quelltextes. 1 public class FirstSWTApplication { 2 3 private Display display; 4 private Shell shell; 5 6 public FirstSWTApplication(Display display) { 7 this.display = display; 8 shell = new Shell(display); 9 shell.settext("titeltext"); 10 shell.setsize(200, 100); private void creategui() { 14 Button button = new Button(shell, SWT.PUSH); 15 button.settext("das ist ein Text"); 16 button.setbounds(shell.getclientarea()); 17 shell.pack(); public void run() { 21 creategui(); 22 shell.open(); 23 while (!shell.isdisposed()) { 24 if (!display.readanddispatch()) 25 display.sleep(); display.dispose(); public static void main(string[] args) { 31 new FirstSWTApplication(Display.getDefault()).run(); Damit ergeben sich die folgenden Bildschirmausgaben: Abbildung 3.2: Beispiel unter Windows 7, MacOS X und Linux (GTK) 16

17 3.1 Grundlagen Erste Erklärungen zum Quelltext: Zeile 3: Das Display-Objekt repräsentiert das Fenstersystem, in dem das Programm läuft. Zeile 4: EineShell ist ein Top-Level -Fenster des Fenstersystems. Später werden auch andere Elemente wie Dialoge vorgestellt. Zeil 14: Mit new Button wird eine Taste in das Fenster eingefügt. Wie die genaue Positionierung erfolgt, wird später erläutert. Wichtig zu wissen ist an dieser Stelle nur, dass keine Positionen angegeben werden, weil ein sogenannter Layout- Manager die Platzierung übernimmt. An diesem Widget ist auch erkennbar, das Widgets in SWT immer erzeugt werden, indem deren Vaterelement als Parameter übergeben wird. In diesem Beispiel handelt es sich beim Vaterelement um das Fenster selbst (Parametershell). Zeile 14: Durch Konstenten wieswt.push werden sehr häufig Eigenschaften eines Widgets bestimmt. Diese Taste ist eine normale Taste, die nach dem Drücken sofort wieder in ihren Ausgangszustand zurückkehrt. Zeile 15:button.setText trägt die Beschriftung der Taste ein. Zeile 16: button.setbounds legt fest, dass die Taste so groß wie der Inhaltsbereich des Fensters werden soll. Zeile 17: Mit shell.pack wird die Layout-Berechnung gestarten. Die Fenstergröße ermittelt sich aus der Größen und Positionen der Widgets innerhalb des Fensters. Wie das genau funktioniert, wird später erläutert. Zeile 9:shell.setText trägt die Titelzeile des Fensters ein. Zeile 10: shell.setsize setzt manuell eine Fenstergröße. Normalerweise wird diese aus dem Inhalt des Fenster berechnet. Die Zeilen 23 bis 27 schließlich sehen zunächst einmal einfach nur merkwürdig aus. Sie beinhalten die Ereignisschleife. Solange das Fenster nach dem Öffnen nicht geschlossen ist, werden Ereignisse zugestellt. Danach wartet die Anwendung auf weitere Ereignisse (Zeile 25). Nach dem Schließen des Fenster beendet sich die Schleife und alle Ressourcen der Anwendung werden durchdisplay.dispose() freigegeben. Eine genauere Betrachtung der manuellen Freigabe erfolgt in Abschnitt Eine SWT-Anwendung hat generell diese Schichtenstruktur: Widget Widget Shell-Klasse Widget Display-Klasse Betriebssystemspezifische Klassen Betriebssystem Abbildung 3.3: Struktur einer SWT-Anwendung 17

18 3.1 Grundlagen Erforderliche Dateien Um das Beispiel übersetzen und ausführen zu können, ist eine jar-datei erforderlich. Sie finden diese entweder direkt im Verzeichnis plugins Ihrer Eclipse-Installation oder im selben Verzeichnis Ihrer Eclipse-Zielplattform. Mitorg.eclipse.swt.Windowsystem.OS.Arch_Version.jar ist vorerst nur eine Datei erforderlich. Dabei stehen die Abkürzungen für: Windowsystem: Name des Fenstersystems OS: Name des Betriebssystems Arch: Name der Prozessorarchitektur Version: Versionsnummer von SWT Die genauen Bezeichnungen für Eclipse 3.5 sehen auf den unterschiedlichen Plattformen so aus: org.eclipse.swt.win32.win32.x86_3.5.2.v3557f.jar für Windows 7, 32 Bit Intel-Architektur, SWT 3.5 org.eclipse.swt.gtk.linux.x86_3.5.2.v3557f.jar für Linux, GTK, 32 Bit Intel-Architektur, SWT 3.5 org.eclipse.swt.cocoa.macosx.x86_64_3.5.2.v3557f.jar für Mac OS X, Cocoa, 64 Bit Intel-Architektur, SWT 3.5 Die wichtigsten darin enthaltenen Pakete, die für die ersten Beispiele benötigt werden, sindorg.eclipse.swt undorg.eclipse.swt.widget. Später werden noch weiterejar-dateien und Pakete hinzukommen Installation der jar-dateien Die zur Übersetzung und Ausführung verwendeten jar-dateien lassen sich auf mehreren Wegen in das eigene Projekt einbinden. In Bezug auf die spätere Vorstellung der Eclipse Rich Client Platform ist es aber am sinnvollsten, die Dateien nicht direkt in das eigene Projekt zu kopieren. Es gibt mehrere Möglichkeiten: In der Installation der Eclipse-IDE sind alle jar-dateien vorhanden. Diese lässt sich als Plattform, gegen die entwickelt wird, eintragen. Das hat aber den großen Nachteil, dass die eigene Anwendung von der Version der IDE abhängig ist. Weiterhin sind in der IDE jar-dateien vorhanden, die hauptsächlich für die IDE erforderlich sind. Diese Dateien könnten versehentlich auch in eigenen Projekten verwendet werden. Besser ist es, das RCP-SDK von downloads/ herunterzuladen und in ein separates Verzeichnis auszupacken. Danach wird das SDK als Zielplattform eingetragen. Statt also die Dateien direkt in das eigene Projekt zu kopieren, ist es sinnvoller, mit einer sogenannten Zielplattform zu arbeiten. In dieser sind allejar-dateien vorhanden, die in den eigenen Projekten Verwendung finden sollen. Die Zielplatform kann in den globalen Eigenschaften der IDE eingestellt werden, wie Abbildung 3.4 zeigt. 18

19 3.1 Grundlagen Die Ziel-Plattform: Abbildung 3.4: Zielplattform einstellen Mit Add... lassen sich neue Zielplattformen wie z.b. das entpackte RCP-SDK hinzufügen (Abbildung 3.5). Abbildung 3.5: Zielplattform einrichten Eine der Plattformen wird schließlich als aktiv markiert, indem der Haken vor deren Namen gesetzt wird. Jetzt können Abhängigkeiten zu einzelnen jar-dateien der Zielplattform im eigenen Projekt eingestellt werden. Dazu dient die vordefinierte Variable ECLIPSE_HOME, die auf die aktuelle Zielplattform verweist. Abhängigkeiten sollten immer relativ zu dieser Variablen angegeben werden, damit die Plattform austauschbar bleibt (Abbildung 3.6). Eclipse hat manchmal Probleme, nach einem Wechsel der Zielplattform die Paket- und Klassennamen in den Projekten korrekt aufzulösen. Ein Neustart der IDE bewirkt hier Wunder. 19

20 3.1 Grundlagen über Variable einbinden Abbildung 3.6: Abhängigkeit von Dateien der Zielplattform Die erste JFace-Anwendung Wie bereits erwähnt, ist JFace eine Klassenbibliothek, die auf SWT aufsetzt und bestimmte Interaktionen vereinfacht und Abstraktion wie z.b. den MVC-Ansatz bietet. Auf die direkte Verwendung von SWT-Klassen kann dennoch nicht verzichtet werden. Der folgende Quelltext zeigt eine Umsetzung des ersten SWT-Beispiels aus Abschnitt mit den Mitteln von JFace (Quelltextdatei FirstJFaceApplication.java). Die Seitenzahlen dienen auch hier nur der späteren Erklärung des Quelltextes. 1 public class FirstJFaceApplication 2 extends ApplicationWindow { 3 4 public FirstJFaceApplication() { 5 super(null); // kein Vater-Fenster // Erzeugen der Oberfläche 10 protected Control createcontents(composite parent) { 11 Button button = new Button(parent, SWT.PUSH); 12 button.settext("das ist ein Text"); 13 button.setbounds(parent.getclientarea()); 14 parent.pack(); 15 return parent; public void run() { 19 setblockonopen(true); 20 open(); 21 Display.getDefault().dispose(); public static void main(string[] args) { 25 new FirstJFaceApplication().run(); Schon auf den ersten Blick ist erkennbar, dass das Grundgerüst der Anwendung anders ausfällt und die Ereignisschleife nicht mehr direkt sichtbar ist. Erklärungen: Zeile 10: Die Methode createcontents wird intern automatisch von der Basisklasse ApplicationWindow aufgerufen, um die Oberfläche zu erzeugen. Als Er- 20

21 3.1 Grundlagen gebnis liefert sie die Vater-Komponente zurück, die alle anderen Komponenten beinhaltet. Es gibt weitere Methoden mit dem NamensaufbaucreateXYZ, die auch automatisch aufgerufen werden. Sie dienen beispielsweise der Erzeugung von Menüs. Zeile 19: setblockonopen: Mit dem Parameter true kehrt der Aufruf der open- Methode erst nach dem Schließen des Fensters zurück. Zeile 20: open: Das Fenster wird angezeigt. Der Aufruf kehrt in diesem Beispiel erst nach dem Schließen des Fensters zurück. Hier verbirgt sich dann auch die Ereignisschleife. Zeile 21: dispose: Alle Ressourcen des Fensters sowie die Ressourcen seiner Kindelemente werden wieder freigeben. Unterbleibt der Aufruf, dann kann Java manche Objekt nicht per Garbage-Collector freigeben. Weiterhin kann es passieren, dass dem Fenstersystem irgendwann die Ressourcen ausgehen. Die Freigabeproblematik wird gleich noch genauer besprochen. Eine JFace-Anwendung hat generell diese Schichtenstruktur: Widget Widget Widget Composite-Klasse ApplicationWindow-Klasse Shell Display-Klasse von der ApplicationWindow- Klasse erzeugt Betriebssystemspezifische Klassen Betriebssystem Abbildung 3.7: Struktur einer JFace-Anwendung Im Unterschied zum reinen SWT wird hier durch die BasisklasseApplicationWindow eine Struktur der Anwendung vorgegeben Erforderliche Dateien Zur Übersetzung und Ausführung sind einige plattformunabhängige jar-dateien von JFace erforderlich. Auch diese sollten aus der Zielplattform stammen: org.eclipse.jface_version.jar: Allgemeine JFace-Klassen org.eclipse.jface.text_version.jar: Klassen zur Behandlung von Textdokumenten org.eclipse.equinox.common_version.jar: Klassen für das zugrunde liegende OSGi-Framework. OSGi wird später im Rahmen der Rich Client Platform eingeführt. org.eclipse.core.commands_version.jar: Klassen, die hauptsächlich von anderen JFace-Klassen verwendet werden 21

22 3.1 Grundlagen org.eclipse.core.runtime_version.jar: Klassen für die Eclipse-Laufzeitumgebung. Auch diese wird mit der Rich Client Platform später betrachtet. org.eclipse.osgi_version.jar: Weitere Klassen für das OSGi-Framework Zusätzlich sind für das Text-Beispiel später diese beidenjar-dateien notwendig, die nicht Bestandteil des RCP-SDK sind. Sie können aus der Installation der Eclipse-IDE kopiert werden. org.eclipse.text_version.jar com.ibm.icu.text_version.jar Diese Dateien sollten auch wirklich nur dann kopiert werden, wenn deren Funktionalität erforderlich ist. Sie werden hier im Skript eingesetzt, um einen mächtigen Texteditor mit Syntaxhervorhebung zu bauen. Die Dateien enthalten Teile des Editors aus der IDE Lauffähige Anwendung Obwohl SWT eine plattformabhängige Bibliothek benötigt, lässt sich aus einem solchen Projekt eine eigenständig lauffähige Anwendung erzeugen. Dazu muss das Eclipse- Projekt für Windows und LinuX lediglich als lauffähige jar-anwendung mit allen Bibliotheken und Ressourcen exportiert werden. Für MacOS X ist es etwas komplizierter. Unter der URL ist eine schrittweise Beschreibung vorhanden Freigabe von Ressourcen Im Zusammenhang mit SWT tritt ein Problem auf, mit dem in Java so normalerweise nicht gerechnet wird. Werden Ressourcen wie Objekte mit new auf dem Heap angelegt, dann kann der Garbage-Collector diese wieder freigeben, sobald keine Referenz mehr darauf verweist. 1 Das funktioniert bei Anwendungen mit SWT so nicht immer. Der Grund ist darin zu sehen, dass SWT Ressourcen des Fenstersystems verwendet, um seine Widgets darzustellen. Zu diesen Ressourcen gehören beispielsweise Fenster, Farben, Zeichensätze und Tasten. Java-Objekte, die solche Ressourcen kapseln, können vom Garbage-Collector nicht automatisch wieder freigeben werden. Dieses muss manuell durch den Aufruf der dispose-methode des Objektes erfolgen. Nach diesem Aufruf darf weder lesend noch schreibend auf das Objekt zugegriffen werden. Sollte das doch geschehen, dann quittiert SWT das mit dem Auslösen einer Ausnahme. Wie sieht das in der Praxis aus? Es gibt zwei einfache Regeln, die das Verhalten beschreiben. Regel 1: Wer ein Element erzeugt, gibt es auch mit dispose() wieder frei. Beispiel für die Erzeugung eines neuen Farb-Objektes: Color color = new Color(display, 0, 0, 255);... color.dispose(); Wird dagegen ein existierendes, vordefiniertes Element verwendet, dann darf es nicht freigeben werden. Beispiel für die Verwendung eines von SWT erzeugten Farb- Objektes: 1 Ok, das ist etwas vereinfacht ausgedrückt. 22

23 3.1 Grundlagen Color color = display.getsystemcolor(swt.color_red); Regel 2: Viele Widgets und andere Ressourcen werden hierarchisch geschachtelt. Bei ihrer Erzeugung wird ein Vaterelement im Konstruktor übergeben. Wird jetzt das Vaterelement gelöscht, dann werden automatisch auch alle seine Kindelemente entfernt und korrekt mit dispose() freigegeben. Beispiel, in dem eine Taste als Kind einem Fenster hinzugefügt wird: Shell shell = new Shell(display); Button button = new Button(shell, SWT.PUSH); Es ist in dem Beispiel ausreichend, das Fenster freizugeben. Dieses löscht automatisch alle seine Kindelemente: shell.dispose(); // Gibt auch button wieder frei. Leider ist es in der Praxis nicht ganz einfach, immer daran zu denken, alle Ressourcen auch wieder freizugeben. Daher sollte sich ein Entwickler an einen gewissen Standardaufbau in seiner Anwendung halten. Die folgenden beiden Abschnitt zeigen diesen sowohl für reine SWT-Lösungen als auch für Anwendungen, die JFace verwenden. Die SWT-Variante ist nur eine Notlösung. Wann immer es möglich ist, sollte der JFace-Weg gewählt werden Ressourcenverwaltung bei reinen SWT-Anwendungen Die Hauptidee besteht darin, das Anlegen sowie die Freigabe von Ressourcen zentral zu bündeln. Beispiel (Quelltext FirstSWTImageResourceApplication): private void createimages() { if (image1 == null) image1 = new Image(display, "resources/image1.gif"); if (image2 == null) image2 = new Image(display, "resources/image2.gif"); private void disposeimages() { if (image1!= null) image1.dispose(); if (image2!= null) image2.dispose(); public void run() { createimages(); creategui(); // Ereignisschleife disposeimages(); display.dispose(); Dieser Ansatz funktioniert für sehr kleine Programm ganz gut. Leider hat er aber gerade für richtige Anwendungen große Nachteile. So werden unter Umständen Bilder angelegt, die nicht immer benötigt werden. Es ist ja bei der Erzeugung nicht sicher, dass beispielsweise der Dialog, der die Ressourcen verwendet, überhaupt angezeigt wird. Es ist auch bei vielen Klassen schwierig, Bilder und andere Ressourcen zwischen mehreren Dialogen, Menüs, usw. zu teilen. 23

24 3.1 Grundlagen Ressourcenverwaltung bei JFace-Anwendungen Der JFace-Ansatz versucht, die Nachteile der SWT-Lösung zu umgehen. Dazu werden entweder ein zentrales oder aber mehrere Registry-Objekte für Bilder, Zeichensätze und Farben der Anwendung angelegt. Eine Registry nimmt normalerweise lediglich Beschreibungen der Ressourcen (sogenannte Deskriptoren) auf. Ein solcher Deskriptor beinhaltet z.b. den Namen der Bilddatei. Beim Programmstart werden die Deskriptoren aller benötigten Ressourcen in der Registry abgelegt. Ist sicher, dass bestimmte Ressourcen immer benötigt werden, dann lassen sich statt der Beschreibungen auch direkt die Ressource-Objekte erzeugen und in der Registry ablegen. Wird später im Betrieb ein Bild oder eine andere Ressource benötigt, dann erzeugt die Registry diese beim ersten Zugriff anhand der Beschreibung. Damit gehören die Ressourcen der Registry, so dass diese beim Programmenende für deren Freigabe verantwortlich ist. Und wann wird die Registry gelöscht? Jedes Registry-Objekt ist ein Kindelement eines Display-Objektes. Sobald das Display-Objekt der Anwendung beseitigt wird, entfernt es auch alle seine Kindelement. Beispiel (Quelltext FirstJFaceImageResourceApplication): public class FirstJFaceImageResourceApplication extends ApplicationWindow { private ImageRegistry imageregistry; public FirstJFaceImageResourceApplication() { super(null); protected Control createcontents(composite parent) { Button button = new Button(parent, SWT.PUSH); button.setimage(imageregistry.get("fighting-duke")); //... return parent; // Registry mit allen möglicherweise benötigten // Deskriptoren der Ressourcen erzeugen. private void createimages() { imageregistry = new ImageRegistry(Display.getDefault()); imageregistry.put("fighting-duke", ImageDescriptor.createFromFile(this.getClass(), "/resources/duke-fight.gif")); public void run() { setblockonopen(true); open(); Display.getDefault().dispose(); public static void main(string[] args) { new FirstJFaceImageResourceApplication().run(); In dem Beispiel oben sollten die Ressourcen-Namen am besten noch durch String- Konstanten definiert werden. 24

25 3.2 Layout-Management Der JFace-Ansatz ist recht mächtig und vermeidet zuverlässig Freigabefehler. Wenn es möglich ist, sollte er verwendet werden. 3.2 Layout-Management Motivation Dieser Abschnitt behandelt generell das Thema, wie einzelne GUI-Elemente ( Widgets ) in einem Dialog angeordnet werden. Dazu stellt sich natürlich sofort die Frage, warum man nicht einfach die Koordinaten der Elemente sowie deren Größen vorgibt. Das Ergebnis wäre also eine absolute Positionierung. Daraus resultieren eine ganze Anzahl von Problemen, die die folgenden Abschnitte anhand verschiedener Szenarien beschrieben Unterschiedliche Plattformen Betrachtet man die Ausgabe auf unterschiedlichen Plattformen, dann ist leicht zu sehen, dass nicht immer alle Zeichensätze auf allen Betriebssystemen vorhanden sind und somit die Texte unterschiedliche Ausmaße besitzen. Weiterhin unterscheiden sich die Designs und damit die Größen der Widgets auf den Plattformen. Das folgende Beispiel wurde mit dem QuelltextNullLayout erstellt. Windows 7: Abbildung 3.8: Windows 7 Abbildung 3.9: LinuX, GNOME Windows XP: Mac OS X (10.6): Abbildung 3.10: Windows XP Abbildung 3.11: MacOS X Es ist gut zu sehen, dass das Layout, das für Windows 7 erstellt wurde, unter LinuX und MacOS X zu zu kleinen Tasten führt. Die Kernaussage lautet also, dass auf die Zeichensatz- und Widgetgrößen kein Verlass ist. Somit können die Größen einzelner Komponenten nicht manuell berechnet werden Internationalisierung Programme werden in der Regel nicht nur mit einer Spracheinstellung ausgeliefert. Gerade für den internationalen Markt ist es wichtig, dass ein Programm beliebig viele Sprachen unterstützt. Dummerweise sind aber viele Texte in Sprachen wie deutsch und englisch unterschiedlich lang. Somit schwankt auch deren Platzbedarf auf dem Bildschirm. Die folgenden Darstellungen verdeutlichen das Problem (Quelltexte NullLayoutLanguagesEN.java und NullLayoutLanguagesDE.java, basieren auf dem vorherigem Beispiel). 25

26 3.2 Layout-Management Abbildung 3.12: Englische Texte Abbildung 3.13: Deutsche Texte Die Idee, einen Dialog in seinem Aussehen manuell der jeweiligen Sprache anzupassen, sollte man schnell wieder begraben, da der Aufwand gewaltig wird. Es muss nicht nur für jede neue Sprache der Dialog angepasst werden, sondern es müssen dann auch verschiedene Varianten desselben Dialogs im Laufe der Jahre gepflegt werden Interaktive Größenänderungen Dialoge sind für den Anwender dann besonders komfortabel zu verwenden, wenn sie in ihrer Größe so verändert werden können, dass sich der Inhalt sinnvoll anpasst. Damit ist gemeint, dass beispielsweise bei manueller Vergößerung eines Dialogs die Texteingabefelder breiter werden, damit mehr Text sichtbar wird. Beschriftungen dagegen sollten ihre Größe behalten. Bei absoluter Platzierung passiert das, was die folgenden Bilder zeigen: Abbildung 3.14: Vergrößerter Dialog Abbildung 3.15: Verkleinerter Dialog Wie zu sehen ist, werden im linken Bild die Tasten nicht größer, obwohl jetzt genügend Platz vorhanden ist. Auch bei anderen Widgets wie Textfeldern ist es durchaus interessant, den Dialog zu vergrößern, um mehr Text sehen zu können, wenn es die Bildschirmgröße zulässt Look and Feel SWT erlaubt, das Aussehen durch CSS-Dateien zu verändern. Da davon die Zeichensatzgrößen sowie Bilder betroffen sein können, führt auch hier die absolute Platzierung in eine Sackgasse Zusammenfassung Eine echte plattformunabhängige Programmierung ist mit absoluten Layouts nicht sinnvoll möglich. Unterschiedliche Zeichensätze oder Zeichengrößen verbieten die manuelle Berechnung einer Größe. Weiterhin erfordert die Portierung einer Anwendung in mehrere Sprachen bei absoluten Layouts manuelles Nacharbeiten, was nicht praktikabel ist. Deshalb sollten in SWT und damit auch JFace Dialoge niemals ohne Layoutmanager erstellt werden. Aber auch andere Toolkits wie QT, GTK, Swing, AWT und WPF arbeiten mit Layouts. Die Manager funktionieren zwar überall etwas unterschiedlich, die Idee und grundsätzliche Arbeitsweise aber sind identisch. Die folgenden Abschnitte stellen die Verwendung sogenannter Layoutmanager vor, die die Platzierung von Widgets anhand von Regeln übernehmen. Eine gute Einführung ist auch unter [Layouts] zu finden. 26

27 3.2 Layout-Management Größe einer Komponente Wenn jetzt auf die absolute Positionierung verzichtet wird und statt dessen Layoutmanager Einsatz finden, stellt sich die Frage, wie ein Layoutmanager die Größe aller möglichen Komponenten ermitteln kann. Die Antwort ist einfach: Er kann es nicht selbst. Nur eine Komponente bzw. deren Basisklasse Control weiß, wie groß sie gerne werden möchte. Und diese bevorzugte Größe fragt der Layout-Manager an allen Komponenten ab, die er platzieren muss. Da jedes SWT-Widget voncontrol erbt, steht die Angabe allen Widgets zur Verfügung. Abbildung 3.16: HierarchieButton Abbildung 3.17: HierarchieLabel Die Basisklasse Control besitzt die Methode computesize, die die bevorzugte Größe des Widgets berechnet und zurückgibt. Mit Hilfe der Methoden getsize bzw. setsize kann die aktuelle Größe des Widgets ausgelesen bzw. überschrieben werden. Somit besitzt jedes Widget eine bevorzugte und eine aktuelle Größe. Die aktuelle Größe kann von der bevorzugten abweichen, wenn beispielsweise der Dialog manuell in seiner Größe verändert und die Widgets angepasst werden. Dann kann ein Widget größer oder kleiner werden, als es eigentlich sein möchte Fill-Layout Das Fill-Layout platziert alle darin enthaltenen Widgets nacheinander bzw. untereinander in einer einheitlichen Größe. Somit werden alle Widgets auf die Maße des größten im Layout vorhandenen Widgets gedehnt. Weiterhin lassen sich die Abstände zwischen den Widgets, die äußeren Ränder um das Layout sowie die Ausrichtung (horizontales oder verktikales Layout) angeben. Widget 1 Widget 2... Widget n Widget 1 Widget 2... Widget n Abbildung 3.18: Anordnung im Fill-Layout Die Ausrichtung wird wie leider Vieles in SWT durch Konstanten im Konstruktor festgelegt: SWT.HORIZONTAL: Die Widgets werden waagerecht angeordnet. SWT.VERTICAL: Die Widgets werden senkrecht angeordnet. Die folgenden Bilder zeigen verschiedene Anwendungen des Layouts. Es ist gut zu erkennen, dass der Layout-Manager trotz unterschiedlicher Plattformen immer sicherstellt, dass die Texte lesbar sind. Die Widgets, in diesem Fall die Tasten, liefern ja auf jeder Plattform unterschiedliche Werte für ihre bevorzugte Größe zurück. 27

28 3.2 Layout-Management Abbildung 3.19: Horizontale Anordnung im Fill-Layout Manuelle Verkleinerung der Dialoge: Abbildung 3.20: Manuelle Verkleinerung im Fill-Layout Vertikale Ausrichtung ohne manuellen Eingriff: Abbildung 3.21: Vertikale Anordnung im Fill-Layout Das folgende, kleine Beispiel zeigt den Einsatz des Fill-Layouts mit vertikaler Ausrichtung (QuelltextFillLayoutApplication).... shell.setlayout(new FillLayout(SWT.VERTICAL)); Button button = new Button(shell, SWT.PUSH); button.settext("1. Taste"); button = new Button(shell, SWT.PUSH); button.settext("2. lange Taste"); button = new Button(shell, SWT.PUSH); button.settext("3. ganz lange Taste"); shell.pack();... Die Abstände um die Widgets sowie zum Rand hin werden nicht verändert. SWT vergibt dazu Standardwerte. Sollen diese überschrieben werden, dann kann das mit Hilfe öffentlicher Attribute geschehen. Dieses ist ohnehin ein Prinzip der Layouts in SWT und JFace. Die Eigenschaften werden nicht über Getter- und Setter-Methoden gelesen und beschrieben, sondern durch direkten Zugriff auf die entsprechenden Attribute. Einige Attribute der KlasseFillLayout: 28

29 3.2 Layout-Management marginwidth: linker und rechter Rand um das Element, das dieses Layout besitzt marginheight: oberer und unterer Rand um das Element, das dieses Layout besitzt spacing: Abstand zwischen den einzelnen Widgets im Layout Das Vaterelement aller Widgets im Beispiel ist das Fenster. Ihm wird der Layout-Manager zugewiesen. Wichtig ist noch der Aufruf shell.pack() am Ende des Beispiels. Mit ihm werden die Layout-Berechnung gestartet und somit die Widgets durch den Manager platziert Row-Layout Der RowLayout ähnelt in gewisser Weise dem FillLayout. Auch hier werden die Widgets vertikal oder horizontal angeordnet. Allerdings berücksichtigt der Layout-Manager die bevorzugten Größen der Widgets und verwendet sie. Somit werden in der Standardeinstellung alle Widgets in ihrer bevorzugten Größe platziert. Dieses Verhalten lässt sich allerdings durch Schreiben eines Attributes ändern. So wird manuell erzwungen, dass alle Komponenten wie beimfilllayout so groß wie die größte Komponente werden sollen. Eine genaue Betrachtung erfolgt weiter unten bei der Vorstellung der Attribute des Layouts. Weiterhin kann bei diesem Layout festgelegt werden, dass ein manueller Zeilenumbruch erfolgen soll, wenn die Layout-Zeile voll ist und dadurch Widgets verkleinert werden müssten. Widget 1 Widget 2 Widget 3... Widget n Widget 1 Widget 2... Widget n Abbildung 3.22: Anordnung im Row-Layout Die Ausrichtung wird auch hier durch die bereits bekannten Konstanten im Konstruktor festgelegt: SWT.HORIZONTAL: Die Widgets werden waagerecht angeordnet. SWT.VERTICAL: Die Widgets werden senkrecht angeordnet. Die folgenden Bilder zeigen verschiedene Anwendungen des Layouts. In der Abbildung 3.23 ist zu erkennen, wie alle Widgets in ihrer bevorzugten Größe platziert wurden. Abbildung 3.23: Horizontale Anordnung im Row-Layout Nach einer manuellen Verkleinerung ergibt sich das folgende Bild. Zu erkennen ist, dass der automatische Zeilenumbruch nicht eingeschaltet wurde. 29

30 3.2 Layout-Management Abbildung 3.24: Manueller Verkleinerung im Row-Layout (ohne Umbruch) Eine manuelle Verkleinerung mit aktivem Zeilenumbruch dagegen würde die Widgets in ihrer bevorzugten Größe belassen: Abbildung 3.25: Manueller Verkleinerung im Row-Layout (mit Umbruch) Das Beispiel mit vertikaler Ausrichtung ist schließlich nicht mehr sonderlich spannend: Abbildung 3.26: Vertikale Anordnung im Row-Layout Der Programmcode für das Beispiel, mit dessen Hilfe die Screenshots hier angefertigt wurden, ist nicht komplex (RowLayoutApplication):... RowLayout layout = new RowLayout(SWT.HORIZONTAL); layout.wrap = false; // kein "Zeilenumbruch" shell.setlayout(layout); Button button = new Button(shell, SWT.PUSH); button.settext("1. Taste"); button = new Button(shell, SWT.PUSH); button.settext("2. lange Taste"); button = new Button(shell, SWT.PUSH); button.settext("3. ganz lange Taste"); shell.pack();... Bei leistungsfähigeren und damit auch komplexeren Layout-Managern ist relativ Programmcode erforderlich, um alle Attribute einzustellen. Daher wurden mit JFace Fabrik- Klassen für alle Layout-Manager eingeführt, die die Erzeugung und das Einstellen des Layouts vereinfachen. Für das im Beispiel eingesetzte RowLayout handelt es sich um die KlasseRowLayoutFactory. Damit wird der Programmcode oben umgeformt:... Button button = new Button(shell, SWT.PUSH); button.settext("1. Taste"); button = new Button(shell, SWT.PUSH); button.settext("2. lange Taste"); button = new Button(shell, SWT.PUSH); button.settext("3. ganz lange Taste"); 30

31 3.2 Layout-Management RowLayoutFactory.swtDefaults().type(SWT.HORIZONTAL).wrap(false).applyTo(shell); pack() wird nicht mehr manuell aufgeufen. Das geschieht automatisch nach Einstellen des Layouts. Daher muss die Layout-Erzeugung jetzt unbedingt nach Einfügen aller Widgets erfolgen. Eine genaue Erklärung der Fabrikklasse ist in der API-Dokumentation zu JFace zu finden. Wie beim FillLayout gibt es auch beim RowLayout einige Attribute, die das Verhalten steuern. In JFace erlaubt die Klasse RowLayoutFactory hier das einfachere Setzen dieser Attribute innerhalb der Layout-Angabe. Attribute: center: Ist das Attribut true, dann werden die Widgets bei unterschiedlichen Breiten bzw. Höhen zueinander zentriert Ansonsten werden sie linksbündig bzw. oben ausgerichtet. justify: Ist das Attribut true, dann werden die Widgets wie im Blocksatz angeordnet. Ist esfalse, dann werden die Widgets am Ursprung platziert. margintop: oberer Rand über dem Layout marginleft: linker Rand neben dem Layout marginbottom: unterer Rand unter dem Layout marginright: rechter Rand neben dem Layout pack: Ist das Attribut true, dann verwendet der Layout-Manager die bevorzugten Größen der Widgets. Ansonsten erzwingt er, dass alle Widgets die Maße der größten Komponente annehmen. spacing: Abstand zwischen den Widgets wrap: Ist das Attributtrue, dann wird der automatische Zeilenumbruch aktiviert. Mit diesen Attributen lassen sich bereits viele Eigenschaften des Layouts verändern. Gerade bei komplexeren Layout-Manager soll der Entwickler aber noch weitergehende Einflussmöglichkeiten erhalten. Dazu kann jedem Widget eine Layout-Eigenschaft zugeordnet werden. Diese Eigenschaft ist ein Objekt, das zusätzliche Layout-Bedingungen aufnimmt, die der Layout-Manager berücksichtigen muss. Es existiert für nahezu jeden Layout-Manager eine eigene Klasse mit Layout-Eigenschaften, weil die Eigenschaften eng an den Manager gekoppelt sind. Die Eigenschaften werden durch den Aufruf der Methode setlayoutdata (nicht setdata!!) am Widget abgelegt. Am Beispiel des RowLayouts lässt sich gut zeigen, was die zusätzlichen Layout-Eigenschaften bewirken können. Möchte der Entwickler ein Widget etwas größer machen, als es die bevorzugte Größe vorsieht, dann ist das bisher praktisch kaum möglich. Wird jetzt aber dem Widget eine Layout-Eigenschaft mit einer fest vorgegeben Größe übergeben, dann verwendet der Layout-Manager diese. Im RowLayout heißt die Eigenschaftsklasse RowData. Dieser Namensaufbau ist übrigens bei allen Layout-Managern einheitlich: StattLayout erhält die Eigenschaftsklasse die Namensendung Data. Das folgende Beispiel erweitert das bisherige, indem die erste Taste zwangsweise eine feste Breite vom 200 Pixeln erhält, aber ihre bevorzugte Höhe beibehält (Verwendung vonswt.default für den Standardwert). 31

32 3.2 Layout-Management... Button button = new Button(shell, SWT.PUSH); button.settext("1. Taste"); RowData layoutdata = new RowData(200, SWT.DEFAULT); button.setlayoutdata(layoutdata);... Abbildung 3.27: Row-Layout mit veränderter Widget-Breite Wie beim Layout werden auch bei den Eigenschaften die Werte direkt und nicht über Setter-Methoden manipuliert. Attribute der KlasseRowData: width: Manuell vergebene Breite des Widgets. Die Angabe vonswt.default bewirkt, dass die errechnete bevorzugte Breite des Widgets verwendet wird. height: Manuell vergebene Höhe des Widgets. Die Angabe von SWT.DEFAULT bewirkt, dass die errechnete bevorzugte Höhe des Widgets verwendet wird. exclude: Die Ausgabe des Widgets soll im Layout unterdrückt werden. Es ist somit unsichtbar und belegt auch keinen Platz. Manuelle Größenabgaben sollten möglichst sparsam eingesetzt werden, weil ansonsten spätestens im Zuge der Internationalisierung der Anwendung wieder das Problem auftritt, dass unterschiedlich lange Texte eventuell nicht mehr richtig passen. Für Widgets, die keinen eigenen Text haben, ist eine manuelle Größenvergabe dagegen manchmal sinnvoll. So können mehrzeilige Texteingabefelder einen vordefinierten Platz belegen. Dieser Platz kann nicht vom Widget selbst ermittelt werden, weil es nicht wissen kann, wieviel Text gleichzeitig sichtbar sein soll Grid-Layout Nach den recht eingeschränkten FillLayout und RowLayout wird mit GridLayout jetzt ein Layout-Manager vorgestellt, der dem Entwickler deutlich mehr Möglichkeiten in Bezug auf die Platzierung sowie die Größen der Widgets einräumt. Die Grundidee besteht darin, alle Widgets in einem tabellarischen Raster anzuordnen. In jeder einzelnen Zelle des Rasters kann sich immer nur ein Widget befinden. Dabei dürfen sich allerdings einzelne Widgets über mehrere Zeilen und Spalten erstrecken. Weiterhin kann der Layout-Manager durch einstellbare Regeln auch Widgets über ihre bevorzugte Größe hinaus vergrößern und eine einheitliche Spaltenbreite erzwingen. 32

33 3.2 Layout-Management Widget 1 Widget 2 Widget 7 Widget 3 Widget 8 Widget 6 Widget 5 Widget 4 Widgets dürfen sich über mehrere Zeilen und/oder Spalten erstrecken. Zeilen dürfen unterschiedliche Höhen, Spalte unterschiedliche Breiten besitzen. Abbildung 3.28: Anordnung im Grid-Layout Bevor ein Beispiel betrachtet wird, sollen zunächst die Attribute und somit die Eigenschaften des Layout-Managers vorgestellt werden. horizontalspacing: Horizontaler Abstand zwischen den Zellen. Damit ist der Abstand zwischen den einzelnen Spalten gemeint. verticalspacing: Vertikaler Abstand zwischen den Zellen. Dieser beschreibt die Distanz zwischen den Zeilen. makecolumnsequalwidth: Wenn dieses Attribut true ist, dann erzwingt das Layout eine einheitliche Breite aller Spalten. Die Breite des breitesten Widgets im kompletten Layout bestimmt die Breite aller Spalten. Ist der Wert dagegenfalse, dann bestimmt in jeder einzelnen Spalte die Breite des darin enthaltenen breitesten Widgets die Gesamtbreite der Spalte. Damit ist noch nicht gesagt, wie sich die schmaleren Widgets verhalten. Normalerweise belegen diese nur einen Teil der ihnen zur Verfügung stehenden Zelle, indem sie an deren jeweiligen Ursprung (z.b. links oben) ausgerichtet werden. Dieses ist anhand der stilisierten Abbildung 3.28 ersichtlich. Es kann aber über die Layout-Eigenschaften einzelner Widgets eingestellt werden, dass sich die Widgets über ihre bevorzugte Größe hinaus vergrößern und die Zelle komplett ausfüllen. Dieses Verhalten wird weiter unten näher betrachtet. margintop: oberer Rand über dem Layout marginleft: linker Rand neben dem Layout marginbottom: unterer Rand unter dem Layout marginright: rechter Rand neben dem Layout marginheight: Oberer und unterer Rand um das Layout. Diese Eigenschaft kann durch das Setzen vonmargintop undmarginbottom überschrieben werden. marginwidth: Linker und rechter Rand neben dem Layout. Diese Eigenschaft kann durch das Setzen vonmarginleft undmarginright überschrieben werden. numcolumns: Anzahl der Spalten im Layout. Diese Angabe ist erforderlich, weil die Widgets ohne die Angabe einer Zelle platziert werden. Statt dessen wird die Reihenfolge, in der die Widgets zu ihrem Vaterelement hinzugefügt werden, verwendet, um daraus die Position im Layout zu ermittlen: Die Widgets werden, beginnend mit dem Ursprung, von links nach rechts und von oben nach unten platziert. Immer wenn die voreingestellte Spaltenzahl erreicht ist, wird eine neue Zeile angefangen. 33

34 3.2 Layout-Management Wie für das RowLayout existiert ebenso für das GridLayout eine Fabrikklasse zum leichteren Erzeugen des Layouts(GridLayoutFactory). Die Mächtigkeit des Layout- Managers ergibt sich aus den vielen Layout-Eigenschaften, die den Widgets übergeben werden können. Die dafür zuständige Klasse heißt GridData. Dessen wichtigste Attribute sind: exclude: Die Anzeige des Widgets wird im Layout unterdrückt, so dass dessen Zelle leer erscheint. grabexcesshorizontalspace: Dieses Attribut steuert das Verhalten des Widgets, wenn das Vaterelement (z.b. das Fenster) schmaler oder breiter wird. Ist das Attribut true, dann schrumpft oder wächst das Widget in der Breite, wenn sich die Breite des Vaterelementes ändert. So kann z.b. ein Textfeld dem Anwender mehr Zeichen gleichzeitig darstellen, wenn der Dialog größer wird. Ein Bezeichner ( Label ) dagegen würde sich nicht verändern, weil sein kompletter Text ohnehin in der Regel sichtbar ist. grabexcessverticalspace: Dieses Attribut steuert das Verhalten des Widgets, wenn das Vaterelement flacher oder höher wird. Ist das Attributtrue, so schrumpft oder wächst das Widget in der Höhe, wenn sich die Höhe des Vaterelementes ändert. widthhint: Wird dieses Attribut verwendet, dann überschreibt es die bevorzugte Breite eines Widgets. So lassen sich manuell Größen vorgeben. Wie schon beim Row-Layout beschrieben, sollte das manuelle Setzen einer Größe nur sparsam und gezielt eingesetzt werden, weil es ansonsten spätestens bei der Internationalisierung Probleme geben kann. heighthint: Dieses Attribut überschreibt die bevorzugte Höhe eines Widgets. horizontalalignment: Mit diesem Attribut wird gesteuert, wie sich ein Widget in einer Zelle verhalten soll: SWT.BEGINNG: Ist das Widget schmaler als die Zelle, dann wird es an den Anfang der Zelle platziert. SWT.CENTER: Ist das Widget schmaler als die Zelle, dann wird es innerhalb der Zelle zentriert. SWT.END: Ist das Widget schmaler als die Zelle, dann wird es an das Ende der Zelle platziert. SWT.FILL: Ist die bevorzugte Breite des Widgets kleiner als die Zellenbreite, dann wird das Widget auf die Breite der Zelle gestreckt. Dieser Wert zusammen mit dem Setzen von grabexcesshorizontalspace bewirkt, dass ein Widget immer die komplette Zellenbreite belegt, auch wenn das Vaterelement seine Größe verändert. verticalalignment: Mit diesem Attribut wird gesteuert, wie sich ein Widget in einer Zelle verhalten soll, wenn seine bevorzugte Höhe kleiner als die Zellenhöhe ist. Die Konstanten sind dieselben wie im vorherigen Auszählungspunkt bei der horizontalen Platzierung mithorizontalalignment. 34

35 3.2 Layout-Management horizontalindent: Belegt ein Widget nicht die komplette Breite einer Zelle, dann kann mit diesem Einzug eingestellt werden, um wieviele Pixel es vom Platzierungsursprung entfernt angeordnet werden soll. Bei einer Ausrichtung am Anfang der Zelle würde es um die angegebene Pixelzahl vom Anfang der Zelle entfernt platziert werden. Bei einer Ausrichtung am Ende der Zelle dagegen würde der Einzug den Abstand vom Ende der Zelle definieren. verticalindent: Wie horizontalindent, nur auf Höhe des Widgets im Layout bezogen. horizontalspan: Anzahl Spalten, die das Widget im Layout belegen soll verticalspan: Anzahl Zeilen, die das Widget im Layout belegen soll minimumwidth: Manche Widgets sollen im Layout bei einer Größenänderung des Dialogs eine gewisse Mindestbreite nicht unterschreiten, damit wichtige Informationen immer sichtbar bleiben. Diese Mindestbreite kann hier festgelegt werden. minimumheight: Manche Widgets sollen im Layout bei einer Größenänderung des Dialogs eine gewisse Mindesthöhe nicht unterschreiten, damit wichtige Informationen immer sichtbar bleiben. Diese Mindesthöhe kann hier festgelegt werden. Aus der langen Aufstellung ist ersichtlich, dass im schlimmsten Fall ziemlich viele Attribute eingestellt werden müssen. Glücklicherweise können die häufigsten Parameter direkt über die Konstruktoren der Klasse GridData übergeben werden. Näheres dazu ist in der API-Dokumentation zu finden. Zusätzlich existiert auch für die KlasseGridData mit GridDataFactory eine Fabrikklasse zum leichteren Befüllen. Das folgende Beispiel zeigt die Layout-Eigenschaften einer Taste, die sich über die volle Breite und Höhe einer Zelle erstrecken soll, obwohl sie eigentlich kleiner sein möchte. Button button = new Button(shell, SWT.PUSH); button.settext("ok"); data = new GridData(SWT.FILL, SWT.FILL, true, true); button.setlayoutdata(data); Die vier Parameter des Konstruktors der KlasseGridData bedeuten: 1. SWT.FILL: Die Taste belegt die komplette Breite der Zelle. 2. SWT.FILL: Die Taste belegt die komplette Höhe der Zelle. 3. true: Die Taste wächst und schrumpft in der Breite, wenn sich die Zellenbreite ändert. 4. true: Die Taste wächst und schrumpft in der Höhe, wenn sich die Zellenhöhe ändert. Anhand des folgenden, relativ sinnlosen Dialogs soll gezeigt werden, wie mit Hilfe des GridLayouts Widgets platziert werden. Abbildung 3.29: Beispieldialog für das Grid-Layout 35

36 3.2 Layout-Management Zunächst wird ein Raster über den Dialog gelegt. Immer dort, wo Widgets aneinander stoßen, entstehen neue Spalten bzw. Zeilen: Abbildung 3.30: Rasterhilfslinien auf dem Dialog Jetzt kann das Layout-Objekt für drei Spalten erzeugt werden. Dabei wird keine identische Spaltenbreite erzwungen. Der folgende Quelltext (GridLayoutApplication) verzichtet auf den Einsatz der Fabrikklasse:... GridLayout layout = new GridLayout(3, false); shell.setlayout(layout); Im nächsten Schritt wird das obere Label als Überschrift in den Dialog eingefügt. Es soll sich über alle drei Spalten erstrecken, weil der Text in anderen Sprachen ja durchaus länger werden kann. Würde das Label lediglich in Spalte 1 stehen, dann würde die Spalte durch einen längeren Labeltext breiter werden. Das ist hier aber nicht gewünscht. Abbildung 3.31: Platzierung des Labels im Grid-Layout Label label = new Label(shell, SWT.BEGINNING); label.settext("titel"); data = new GridData(SWT.FILL, // Zelle horizontal füllen SWT.DEFAULT, // bevorzugte Höhe true, // horizontal wachsen false, // vertikal nicht wachsen 3, // 3 Spalten 1); // eine Zeile label.setlayoutdata(data); Das mehrzeilige, scrollbare Texteingabefeld ist sicherlich das interessanteste Widget im Beispiel. Es soll sowohl horizontal als auch vertikal die komplette Zelle belegen und mitwachsen. Weiterhin soll dem Widget eine bevorzugte Breite übergeben werden, weil das Widget selbst eine viel zu kleine annimmt. 36

37 3.2 Layout-Management Abbildung 3.32: Platzierung des Textfeldes im Grid-Layout Text text = new Text(shell, SWT.MULTI SWT.WRAP SWT.BORDER SWT.H_SCROLL SWT.V_SCROLL); data = new GridData(SWT.FILL, // Zelle horizontal füllen SWT.FILL, // Zelle vertikal füllen true, // horizontal wachsen true, // vertikal wachsen 1, // eine Spalte 2); // zwei Zeilen data.widthhint = 200; // bevorzugte Breite 200 Pixel text.setlayoutdata(data); Abschließend soll noch eine der beiden Tasten betrachtet werden. Zu beachten ist, dass beide Tasten unabhängig von ihrem Inhalt (ihrer Beschriftung) immer gleich breit sein sollen. Normalerweise würde der Text die Breite bestimmen. Weiterhin ist im Beispiel verlangt, dass die Tasten auch horizontal wachsen. Das ist in der Praxis natürlich recht unsinnig. Abbildung 3.33: Platzierung einer Taste im Grid-Layout Button button = new Button(shell, SWT.PUSH); button.settext("ok"); data = new GridData(SWT.FILL, // Zelle horizontal füllen SWT.FILL, // Zelle vertikal füllen false, // horizontal nicht wachsen true); // vertikal wachsen button.setlayoutdata(data); Soll die Taste dagegen ihre bevorzugte Breite behalten, dann dürfte sie nicht auf die Zellenbreite gestreckt werden: Button button = new Button(shell, SWT.PUSH); button.settext("ok"); data = new GridData(SWT.DEFAULT, // BEVORZUGTE BREITE! SWT.FILL, // Zelle vertikal füllen false, // horizontal nicht wachsen true); // vertikal wachsen button.setlayoutdata(data); 37

38 3.2 Layout-Management Das Ergebnis zeigt Abbildung Abbildung 3.34: Platzierung einer Taste im Grid-Layout ohne Streckung Geschachtelte Layout Die bisher vorgestelten Layout-Manager waren für sich alleine gesehen zwar schon recht hilfreich, scheitern aber schnell bei komplexen Layouts. Das liegt daran, dass immer jedem Fenster genau ein Layout-Manager zugeordnet war, der das Aussehen des Dialoginhalts selbst festlegen musste. Dieser Ansatz ist allerdings für komplizierte Layouts nicht flexibel genug, bzw. würde extrem mächtige und damit auch umständlich zu verwendende Layout-Manager benötigen. Eine einfachere Lösung besteht darin, Layouts ineinander zu schachteln. Dazu existieren Widgets, die selbst wiederum als Container für andere Widgets dienen. Diesen Containern kann ein eigener Layout-Manager zugewisen werden. Somit ergibt sich eine hierarchische Schachtelung von Layouts. Im folgenden Bild wird ein Composite-Widget als Container eingesetzt. Das Widget hat bei dieser Verwendung normalerweise keine eigene Darstellung. Es dient hauptsächlich dazu, andere Widgets aufzunehmen und diese mit Hilfe eines eigenen Layouts darzustellen. Fenster mit GridLayout Widget 1 Widget 2 Composite-Widget mit FillLayout Abbildung 3.35: Verschachtelung von Containern mit jeweils eigenen Layouts Das folgende Beispiel zeigt einen Dialog mit zwei nebeneinander angeordneten, identisch breiten Tasten (NestedLayoutsApplication). Für solche Dialoge mit Standardtasten werden später spezielle Fensterklassen vorgestellt, so dass es normalerweise unnötig ist, die Tasten wie im Beispiel selbst zu platzieren. NestedLayoutsApplication Composite-Widget mit FillLayout (der Rahmen zeigt die Ausmaße des Composite-Objektes) Abbildung 3.36: Beispiel für ineinander geschachtelte Layouts 38

39 3.2 Layout-Management Der Rahmen um das Composite-Objekt mit den beiden Tasten soll nur die Ausmaße des Containers verdeutlichen. // Der Container für die Tasten erhält ein FillLayout. Composite buttonpanel = new Composite(shell, SWT.NONE); buttonpanel.setlayout(new FillLayout()); // Der Container streckt sich horizontal über // zwei Spalten. Er wird im übergeordneten GridLayout // rechtsbündig (SWT.END) in seine Zelle gesetzt. // Er soll nicht mit der Zelle mitwachsen. data = new GridData(SWT.END, SWT.DEFAULT, false, false, 2, 1); buttonpanel.setlayoutdata(data); // Die Tasten werden zum Composite-Objekt hinzugefügt. new Button(buttonPanel, SWT.PUSH).setText("Ok"); new Button(buttonPanel, SWT.PUSH).setText("Cancel"); Die Screenshots zeigen das Verhalten des Dialogs bei Größenänderungen unter Windows und Mac OS X. Abbildung 3.37: Größenänderungen bei ineinander geschachtelten Layouts Man erkennt, dass die Reihenfolge der Tasten unter Mac OS X nicht den Vorgaben Apples entspricht. Dieses Problem lösen die vordefinierten Dialogklassen, die später betrachtet werden Form-Layout DasFormLayout ist das flexibelste und komplexeste Standardlayout im SWT. Hier werden die Widgets relativ zueinander platziert und an ihren Kanten ausgerichtet Grundidee Die Abbildung 3.38 zeigt, wie die Widget-Ränder entweder an den Rändern des Vater- Containers (hier das Fenster) oder an den Rändern anderer Widgets ausgerichtet wer- 39

40 3.2 Layout-Management den. Zusätzlich lassen sich auch relative Maße angeben, so dass z.b. ein Widgetrand immer an 50 % der Fensterbreite ausgerichtet sein soll. Ändert sich die Fensterbreite, dann wandert das Widget bzw. dessen Rand mit. Widget 2 Widget 1 Widget 3 Widget 1 wird mit seinem linken und rechten Rand am Fenster ausgerichtet. Widget 3 wird mit seinem rechten Rand immer am Rand des Fenster ausgerichtet. Widget 4 Widget 5 Widget 3 wird mit seinem unteren Rand am oberen Rand von Widget 5 ausgerichtet. Widget 5 wird mit seinem unteren Rand immer am Fenster ausgerichtet. Abbildung 3.38: Anordnung im Form-Layout DasFormLayout ist sehr mächtig, dummerweise aber auch etwas unhandlich in seiner Anwendung. Zunächst werden die wichtigsten Eigenschaften des Layouts vorgestellt. spacing: Standardabstand zwischen den einzelnen Widgets in Pixeln margintop: Größe des Randes oberhalb des Layouts in Pixeln marginleft: Größe des Randes links des Layouts in Pixeln marginbottom: Größe des Randes unterhalb des Layouts in Pixeln marginright: Größe des Randes rechts des Layouts in Pixeln marginheight: Größe des Randes oberhalb und unterhalb des Layouts in Pixeln marginwidth: Größe des Randes links und rechts des Layouts in Pixeln Auch beim FormLayout werden die eigentlichen Platzierungsangaben für einzelne Widgets über Layout-Eigenschaften der Widgets eingestellt. In diesem Fall ist es die Klasse FormData. Sie nimmt für die vier Seiten des Widgets die Platzierungsbeziehungen auf. Jede Beziehung wird wiederum durch ein Objekt der Klasse FormAttachment definiert. Attribute der KlasseFormData: top: Ausrichtung der oberen Kante des Widgets left: Ausrichtung der linken Kante des Widgets bottom: Ausrichtung der unteren Kante des Widgets right: Ausrichtung der rechten Kante des Widgets width: Wenn die bevorzugte Breite des Widgets nicht zum Layout passt, dann kann hier manuell eine Breite vergeben werden. Das sollte wie bei den anderen Layouts in der Regel nur dann verwendet werden, wenn das Widget nicht in der Lage ist, eine sinnvolle Breite selbst zu berechnen (z.b. mehrzeilige Texteingabefelder). height: Wenn die bevorzugte Höhe des Widgets nicht zum Layout passt, dann kann hier eine Höhe vorgegeben werden. 40

41 3.2 Layout-Management Schließlich fehlt noch die Klasse FormAttachment, die eine Platzierungsregel für eine Kante enthält. Wichtig ist hierbei, dass es prinzpiell zwei Möglichkeiten der Anordnung einer Kante gibt: Sie wird an einer Kante eines Zielwidgets im selben Layout oder an einer Kante des Vater-Containers (z.b. des Fensters) ausgerichtet. alignment: Kante des Widgets, an dem sich dieses Widget ausrichten soll. Die möglichen Werte für die eigene obere oder untere Kante sind: SWT.TOP: Die Platzierungsangabe bezieht sich auf den oberen Rand des Zielwidgets. SWT.CENTER: Die Platzierungsangabe bezieht sich auf die Mitte des Zielwidgets. SWT.BOTTOM: Die Platzierungsangabe bezieht sich auf den unteren Rand des Zielwidgets. Die möglichen Werte für die eigene linke oder rechte Kante sind: SWT.LEFT: Die Platzierungsangabe bezieht sich auf den linken Rand des Zielwidgets. SWT.CENTER: Die Platzierungsangabe bezieht sich auf die Mitte des Zielwidgets. SWT.RIGHT: Die Platzierungsangabe bezieht sich auf den rechten Rand des Zielwidgets. control: Dieses Attribut nimmt die Referenz des Widgets auf, zu dem das eigene Widget relativ positioniert werden soll. Hat control den Wert null, dann soll die eigene Widgetseite relativ zum Vater-Container platziert werden. offset: Absoluter Abstand in Pixeln von der Kante des Zielwidgets numerator, denominator: Ein Beispiel verdeutlicht die Verwendung dieser beiden zunächst merkwürdig erscheinenden Attribute: Ein Widget soll mit seinem linken Rand immer in der Mitte des Dialogs erscheinen. Somit muss sein linker Rand am linken Rand des Dialogs ausgerichtet werden. Die Angabe in der Mitte wird durch den Prozentwert der Breite des Dialogs angegeben, hier also 50 % der Breite. Die beiden Attribute stellen jetzt Zähler (numerator) und Nenner (denominator, Standardwert ist 100) des Bruchs, mit dem der Prozentwert abgebildet wird, dar. Somit ergibt sich die aktuelle Position durch folgende Berechnung: pos = numerator size+offset. denominator size ist hierbei in dem Beispiel die automatisch ermittelte Breite des Dialogs. Damit das Ganze nicht zu abstrakt bleibt, zeigen einige Beispiele in den folgenden Abschnitten die Verwendung der Klassen auf Beispiel für die relative Anordnung zum Vaterobjekt Hier soll sich Widget W1 links und rechts am Fenster ausrichten. Sein linker Rand bleibt also immer am linken Rand des Fenster, sein rechter am rechten Rand des Fenster. Damit belegt W1 die komplette Fensterbreite. 41

42 3.2 Layout-Management FormData data = new FormData(); W1 // Der rechte Rand sitzt bei 100% Breite // des Fensters (100/100). Der Offset // ist 0. data.right = new FormAttachment(100); // Der linker Rand sitzt bei 0% Breite // des Fensters (0/100). Der Offset // ist 0. data.left = new FormAttachment(0); w1.setlayoutdata(data); Abbildung 3.39: Beispiel 1 für die Anordnung im Form-Layout Beispiel für die relative Platzierung zu einem anderen Widget Widget W1 wird soll seinen linken Rand immer relativ zum rechten Rand von W2 platzieren. Der Abstand zwischen beiden beträgt 0 Pixel, was nicht sehr praxisnah ist. FormData data = new FormData(); // Der rechte Rand schließt direkt an // den linken Rand von W1 an. Der Abstand // wird durch das Layout vorgegeben. data.right = new FormAttachment(w2); W1 W2 // Der untere Rand sitzt bei 100% Höhe // des Fensters (100/100). Der Offset // ist 0. data.bottom = new FormAttachment(100); w1.setlayoutdata(data); Abbildung 3.40: Beispiel 2 für die Anordnung im Form-Layout Beispiel für die relative Anordnung zum Vaterobjekt und zu einem anderen Widget W1 und W2 belegen jeweils 50 % der Breite des Fensters und haben in der Mitte einen zusätzlichen Abstand von 4 Pixeln. 42

43 3.2 Layout-Management W1 W2 FormData w1data = new FormData(); FormData w2data = new FormData(); // Der rechte Rand von W2 liegt am Fenster. w2data.right = new FormAttachment(100); // Der linke Rand von W2 liegt mit 4 Pixeln // Abstand rechts von W1. w2data.left = new FormAttachment(w1, 4); // Der rechte Rand von W1 liegt bei 50% der // Breite (minus 2 Pixel). w1data.right = new FormAttachment(50, -2); // Der linke Rand von W1 liegt am Fenster. w1data.left = new FormAttachment(0); w1.setlayoutdata(w1data); Abbildung 3.41: Beispiel 3 für die Anordnung im Form-Layout Auszurichtende Zielseiten Es fällt auf, dass nirgendwo die Kanten, auf die sich die Positionierungen beziehen, angegeben sind.alignment wird also in der KlasseFormAttachment niemals beschrieben. Das ist in diesen Beispielen auch nicht notwendig, weil das Form-Layout die Angabe selbst ermitteln kann. Beispiel: W1 W2 Der linke Rand von W2 wird an dem rechten Rand von W1 ausgerichtet. Abbildung 3.42: Automatische Randerkennung im Form-Layout Der rechte Rand von W1 hat den linken von W2 als Nachbarn. Das wird automatisch erkannt und muss daher nicht angegeben werden. Lediglich in Szenarien, in denen die Kante des Zielobjektes nicht eindeutig erkennbar ist, muss sie angegeben werden. Das ist beispielsweise dann der Fall, wenn ein Widget über einem anderen steht und seine linke oder rechte Kante auf die linke oder rechte Kante des Ziels ausgerichtet werden muss. Dann kann das Form-Layout nicht entscheiden, welche Kante des Ziels gemeint ist. Beispiel: W1 W2 Soll der linke Rand von W2 an dem rechten oder linken Rand von W1 ausgerichtet werden? Abbildung 3.43: Keine automatische Randerkennung im Form-Layout 43

44 3.2 Layout-Management Durchgängiges Beispiel Ein vollständiges Beispiel (FormLayoutApplication) schließt die Betrachtung des Form-Layouts ab. Viele der vorher vorgestellten Attribute lassen sich vergleichsweise bequem über die Kontruktoren setzen. Als Basis dient dieser Screenshot: Abbildung 3.44: Screenshot des Beispiels Die Rahmen um das Widget für die Titelzeile sowie das Bild dienen nur dazu, deren Ausmaße zu erkennen. Auch für dieses Beispiel gilt, dass es bereits vordefinierte Dialoge mit den Standardtasten gibt und dass diese der manuellen Programmierung vorzuziehen sind. Im Layout erhalten alle Widgets einen Abstand untereinander von 4 Pixeln. Das ist auch der Abstand zum Fensterrand. FormLayout layout = new FormLayout(); layout.marginheight = 4; // oberer und unterer Rand layout.marginwidth = 4; // linker und rechter Rand layout.spacing = 4; // Abstände zwischen den Komponenten shell.setlayout(layout); Im nächsten Schritt wird die Titelzeile eingefügt. Sie ist ein Label, das sich immer über die komplette Fensterbreite erstrecken soll und oben am Fenster platziert ist. Der untere Rand wird nicht festgelegt. Seine Position ergibt sich aus der des oberen zuzüglich der bevorzugten Höhe. Abbildung 3.45: Einfügen des Titels Label label = new Label(shell, SWT.BEGINNING SWT.BORDER); label.settext("titel"); FormData data = new FormData(); // linker Rand bei 0% Fensterbreite data.left = new FormAttachment(0); // rechter Rand bei 100% Fensterbreite data.right = new FormAttachment(100); label.setlayoutdata(data); 44

45 3.2 Layout-Management Jetzt wird die Taste für den Abbruch ( Cancel ) in den Dialog eingefügt. Sie sitzt immer am unteren rechten Rand des Dialogs. Die Positonen ihres oberen und linken Randes ergeben sich dann aus der bevorzugten Größe. Abbildung 3.46: Einfügen der Abbruch-Taste Button cancelbutton = new Button(shell, SWT.PUSH); cancelbutton.settext("cancel"); data = new FormData(); // rechter Rand bei 100% Fensterbreite data.right = new FormAttachment(100); // unterer Rand bei 100% Fensterhöhe data.bottom = new FormAttachment(100); cancelbutton.setlayoutdata(data); Jetzt kann die Ok-Taste links neben die Abbruch-Taste gesetzt werden. Ihr rechter Rand positioniert sich relativ zum linken Rand der Abbruch-Taste. Die Abstände zwischen den Tasten ergeben sich aus dem spacing-wert des Layouts. Sollen beide Tasten eine identische Breite aufweisen, dann müsste in das Form-Layout ein Fill-Layout eingefügt werden, das beide Tasten aufnimmt. Abbildung 3.47: Einfügen der Ok-Taste Button okbutton = new Button(shell, SWT.PUSH); okbutton.settext("ok"); data = new FormData(); // rechten Rand an der Cancel-Taste ausrichten data.right = new FormAttachment(cancelButton); // unterer Rand bei 100% Fensterhöhe data.bottom = new FormAttachment(100); okbutton.setlayoutdata(data); Das Bild am linken Rand soll in der Höhe, aber nicht in der Breite wachsen. Es wird daher mit seinem linken Rand am Fenster, mit seinem oberen am Titel und mit seinem unteren an der Abbruch-Taste befestigt. Nur durch die Anbindung an die Taste wächst das Bild in 45

46 3.2 Layout-Management der Höhe mit, weil die Taste ja bei einer Dialogvergrößerung nach unten wandert und ihre Größe beibehält. Abbildung 3.48: Einfügen des Bildes Label dukelabel = new Label(shell, SWT.CENTER SWT.BORDER); dukelabel.setimage(imageregistry.get("duke")); data = new FormData(); // linker Rand bei 0% Fensterbreite data.left = new FormAttachment(0); // oberen Rand am Titel-Label ausrichten data.top = new FormAttachment(label); // unteren Rand an der Cancel-Taste ausrichten data.bottom = new FormAttachment(cancelButton); dukelabel.setlayoutdata(data); Abschließend fehlt noch das mehrzeilige Texteingabefeld mit seinen Scrollbalken. Es soll sowohl in der Höhe als auch in der Breite mitwachsen. Dazu werden sein linker Rand am Bild, sein oberer Rand am Titel, sein rechter Rand am Fensterrahmen und sein unterer Rand an der Abbruch-Taste ausgerichtet. Durch die beiden zuletzt genannten Bedingungen kann der Text bei Größenänderung des Dialogs mitwachsen oder auch schrumpfen. Abbildung 3.49: Einfügen des Textfeldes Text text = new Text(shell, SWT.MULTI SWT.WRAP SWT.BORDER SWT.H_SCROLL SWT.V_SCROLL); data = new FormData(); // linken Rand am Duke-Label (Bild) ausrichten data.left = new FormAttachment(dukeLabel); // oberen Rand am Titel-Label ausrichten data.top = new FormAttachment(label); // rechter Rand ist bei 100% Fensterbreite data.right = new FormAttachment(100); // unteren Rand an der Cancel-Taste ausrichten data.bottom = new FormAttachment(cancelButton); text.setlayoutdata(data); 46

47 3.2 Layout-Management Form-Layout (JGoodies) Das Form-Layout erlaubt zwar eine sehr flexible Gestaltung von Dialogen, hat aber die Mängel, dass einerseits eine große Menge Code geschrieben werden muss und andererseits das Vorgehen häufig als wenig intuitiv empfunden wird. Der zweite Punkt rührt daher, dass viele Entwickler ein Raster auf einen Dialogentwurf legen und so in Zeilen und Spalten denken. Genau das wird beim Form-Layout aber nicht direkt sichtbar. Das FormLayout von JGoodies schafft hier auf eine recht komfortable Art und Weise Abhilfe. An dieser Stelle soll keine komplette Einführung in das FormLayout erfolgen. Unter der URL lässt sich die SWT-Portierung der eigentlich für Swing geschriebenen Klassenbibliothek mit einer sehr guten Dokumentation kostenlos herunterladen Grundidee Im Form-Layout werden die einzelnen Komponenten tabellarisch angeordnet. Im Gegensatz zum Form-Layout aus SWT lassen sich die Struktur der Tabelle und das Verhalten der einzelnen Zeilen und Spalten vorab durch einen String festlegen. Dadurch fallen die einzelnen Ausrichtungen beim Einfügen von Komponenten weg. Weiterhin erlaubt das Form-Layout auch Größenangaben in Form so genannter Dialog Units. Werden jetzt Abstände nicht pixel-genau sondern durch Dialog Units spezifiziert, dann passen sich die Abstände automatisch an, wenn beispielsweise die Zeichensatzgröße im Dialog oder die Pixelgröße des Bildschirm verändert werden. Durch eine Pixelangabe dagegen wären die Abstände bei vergrößerten Zeichensätzen dann zu klein. Die Abbildung 3.50 zeigt einen Beispieldialog mit dem zugrunde liegenden tabellarischen Raster. Wichtig ist hier, dass auch die Abstände zwischen den Komponenten als einzelne Zeilen und Spalten beschrieben werden. FormLayout layout = new FormLayout( "4dlu, left:pref, 4dlu, fill:max(80dlu;pref):grow, 4dlu, pref, 4dlu", "4dlu, pref, 4dlu, fill:pref:grow, 4dlu, fill:pref:grow", 4dlu); Zeilen fill:max(80dlu;pref):grow Abbildung 3.50: Dialog mit Form-Layout Die Definition der Zeilen und Spalten wird in Form zweier Strings an den Layout-Manager übergeben. Der erste String beinhaltet die Spaltenmaße: 1. Die erste Spalte ist lediglich ein Abstandshalter zum linken Rand mit einer Breite von vier Dialog-Einheiten ( Dialog Units ). 2. Die Spalte mit dem Duke soll in der bevorzugten Breite (pref) linksbündig (left) gesetzt werden. Die linksbündige Angabe ist eigentlich überflüssig, da sich in dieser Spalte nur eine Komponente befindet. 3. Jetzt folgt wieder ein Platzhalter von vier Dialog-Einheiten. 47

48 3.2 Layout-Management 4. Die vierte Spalte ist etwas komplizierter definiert. Sie soll beim Start ihre bevorzugte Breite (pref) bzw. mindestens 80 Dialog-Einheiten einnehmen. Die Angabe (80dlu,pref) beinhaltet ein Intervall mit einer Untergrenze von 80 Dialogeinheiten und einer Obergrenze, der bevorzugten Breite. Die Spalte kann zusätzlichen Platz belegen (fill) und sie darf, wenn der Dialog größer wird, auch in die Höhe wachsen (grow). 5. Dann folgt der Platzhalter, der einen festen Abstand zu den beiden Tasten erzwingt. 6. Die Tasten sollen in ihren bevorzugten Breiten angeordnet werden. 7. Abschließend kommt ein Platzhalter, der den Abstand zum rechten Rand definiert. Nach den Spalten fehlt noch die Festlegung der Zeilen: 1. Die erste Zeile ist ein Abstandshalter zum oberen Rand mit einer Höhe von vier Dialog-Einheiten. 2. Die Spalte mit der Überschrift soll in der bevorzugten Höhe der Komponenten gesetzt werden. Hier bestimmt nur die bevorzugte Höhe des Labels Titel den Platz. 3. Jetzt folgt wieder ein Platzhalter von vier Dialog-Einheiten. 4. Die vierte Zeile besitzt drei Angaben. Sie soll beim Start ihre bevorzugte Höhe einnehmen (pref), sie kann zusätzlichen Platz belegen (fill) und sie darf, wenn der Dialog größer wird, auch in die Höhe wachsen (grow). 5. Dann folgt der Platzhalter, der einen festen Abstand zwischen den beiden Tasten erzwingt. 6. Diese Zeile verhält sich genau wie die vierte. 7. Abgeschlossen wird die Beschreibung durch einen Platzhalter, der den Abstand zum unteren Rand definiert Einfügen von Komponenten im Beispiel Nachdem das Grundgerüst des Dialogs steht, lassen sich jetzt sehr einfach die Komponenten einfügen. In der Regel ist es ausreichend, ihre Position im Raster sowie die Anzahl Zeilen und Spalten, über die sich sich erstrecken, anzugeben. Dabei ist zu beachten, dass die Zählung der Zeilen und Spalten bei 1 beginnt! DerPanelBuilder hilft beim Einfügen von Widgets in den Vater-Container. Dazu werden ihm Bedingungen in Form der Klasse CellConstraints übergeben. Diese bestehen in der Regel aus der X- und Y-Position der Zelle, in der das Widget platziert sein soll. Zusätzlich lassen sich auch die Anzahl Spalten und Zeilen angeben, die ein Widget belegen soll. Fehlt diese Angabe, dann belegt das Widget genau eine Zelle. // Der Panel-Builder hilft beim Einfügen von Komponenten // in das Layout. Er bekommt als zweiten Parameter // den Container übergeben, in den die Widgets // eingefügt werden. PanelBuilder builder = new PanelBuilder(layout, shell); // Die Bedingungen werden später durch Aufruf von // Methoden übergeben. Das Objekt kann // wiederverwendet werden. CellConstraints cc = new CellConstraints(); 48

49 3.2 Layout-Management Die Titelzeile erstreckt sich über eine Zeile und fünf Spalten, wobei die Platzhalterspalten mitgezählt werden. Abbildung 3.51: Einfügen des Titels // Der Text über allen Komponenten befindet sich in // Zelle (2,2) und erstreckt sich über 5 Spalten // und eine Zeile. Label label = new Label(shell, SWT.BEGINNING); label.settext("titel"); builder.add(label, cc.xywh(2, 2, 5, 1)); Das mehrzeilige Texteingabefeld erstreckt sich über eine Spalte und drei Zeilen. Abbildung 3.52: Einfügen des Textfeldes Text text = new Text(shell, SWT.MULTI SWT.WRAP SWT.BORDER SWT.H_SCROLL SWT.V_SCROLL); builder.add(text, cc.xywh(4, 4, 1, 3)); Als letztes Widget in diesem Beispiel soll noch die Ok-Taste eingefügt werden. Sie belegt nur eine einzige Zelle. Abbildung 3.53: Einfügen der Ok-Taste Button button = new Button(shell, SWT.PUSH); button.settext("ok"); builder.add(button, cc.xy(6, 4)); Das Form-Layout von JGoodies unterstützt auch identische Spaltenbreiten und Zeilenhöhen (siehe API-Dokumentation). 49

50 3.3 SWT-Widgets GUI-Designer Es gibt Entwickler, denen die manuelle Programmierung von Layouts wenig Spaß bereitet. Daher bietet es sich in der Praxis an, die Oberfläche mit einen GUI-Editor interaktiv zu erzeugen. Unterstützung bieten unter Anderem: WindowBuilder Pro für Eclipse (kostenlos unter Visual Editor Plugin für Eclipse (noch etwas unfertig, unterstützt nicht immer die aktuellsten Eclipse-Versionen, Jigloo-Plugin für Eclipse (www.cloudgarden.com/jigloo/, kostenlos für den nicht-kommerziellen Einsatz) Hier können die Komponenten visuell den Zellen zugeordnet werden. Ein eigener Editor erlaubt die Änderung von Attributen einer Komponente oder eines Constraints. Der Nachteil des Ansatzes besteht darin, dass die mit einer IDE interaktiv erstellten Oberflächen sich nicht immer in einer anderen IDE interaktiv verändern lassen, da GUI-Editoren nicht zwangsweise dieselben Techniken verwenden, um die erzeugten Oberflächen so abzuspeichern, dass sie bearbeitbar bleiben. Hier hilft nach einem IDE-Wechsel gelegentlich nur noch der Weg der manuellen Programmierung. Ein GUI-Designer entbindet den Entwickler aber nicht davon, Layout-Manager und deren Verhalten zu kennen. Auch ein GUI-Designer verwendet für die Platzierung Layouts. 3.3 SWT-Widgets In diesem Kapitel werden einige wichtige Widgets aus SWT vorgestellt. Das Kapitel 3.7 stellt anhand eines Widgets aus JFace vor, wie es das entsprechende Gegenstück aus SWT kapselt und ihm einen sogenannten Model-View-Controller-Ansatz (MVC) hinzufügt. Sie finden an dieser Stelle keine Erklärung der kompletten SWT-API. Diese würde sicherlich mehrere Bücher füllen. Statt dessen erhalten Sie eine Übersicht über die wichtigsten Komponenten, die zum Bau einer Oberfläche benötigt werden. Diese Komponenten sind aber nicht unabhängig voneinander. Sie stehen vielmehr über eine Vererbungshierarchie mit gemeinsamen Basisklassen in Verbindung (siehe Abschnitt 3.5). Die folgende Aufstellung ist nicht vollständig. Sie soll Ihnen lediglich eine erste Orientierung zur Auswahl und zur Suche in der SWT-API geben. Sehen Sie sich einfach einmal die Übersicht über wichtige Widgets unter widgets/ an. Neben den Widgets aus dem Paket org.eclipse.swt existieren auch weitere im Paket org.eclipse.swt.custom. Diese haben ähnliche Namen wie die aus org.eclipse.swt, besitzen aber teilweise ein erweitertes Verhalten oder wurden in ihrer Darstellung so angepasst, dass sie optimal in Tabellen eingefügt werden können. 50

51 3.3 SWT-Widgets Tabelle 3.1: Wichtige Widgets Name Browser Verhalten und Verwendung Der Browser ist ein Widget, das einen im Betriebssystem installierten Browser kapselt. Button (SWT.PUSH) Button (SWT.FLAT) Ein Button, der mit der Konstanten SWT.PUSH erzeugt wurde, ist eine normale Taste. Sie kann gedrückt werden, wobei der Selektionszustand nicht erhalten bleibt. Sie dient dazu, Aktionen anzustoßen, indem Ereignisse ausgelöst werden. Die Taste verhält sich wie die mit der Konstanten SWT.PUSH erzeugte. Sie weist aber eine andere (flachere) Rahmendarstellung auf. Button (SWT.ARROW SWT.LEFT) Button (SWT.CHECK) Button (SWT.RADIO) Button (SWT.TOGGLE) Combo (SWT.DROP_DOWN), CCombo Combo (SWT.SIMPLE) Die Taste verhält sich wie die mit der Konstanten SWT.PUSH erzeugte. Anhand der zusätzlich übergebenen Konstante erzeugt sie eine Pfeildarstellung. Erlaubt sindswt.left,swt.right,swt.up undswt.down. Es handelt sich um eine Taste, die selektiert und deselektiert werden kann. Der Selektionszustand bleibt bis zur Änderung erhalten. Die Komponente dient dazu, eine Möglichkeit an- oder abzuwählen, ohne dass dadurch die Belegung einer anderen Komponente direkt beeinflusst wird. Beispiel: Fettund Kursivschrift können unabhängig von einander bestimmt werden. Ein Button, der mit der Konstanten SWT.RADIO erzeugt wurde, ist eine Taste, die sich an- oder abwählen lässt. Befinden sich andere solcher Tasten im Layout in ihrer Nähe, dann bilden diese eine Gruppe, von der immer nur eine Taste zu einem Zeitpunkt selektiert sein kann. Dadurch ist sichergestellt, dass bei Auswahl einer Belegung keine andere in der Gruppe möglich ist. Beispiel: Die Auswahl einer Textausrichtung für links- und rechtsbündig ist nicht gleichzeitig sinnvoll. Diese ist eine Taste, die wie eine Taste mit der KonstantenSWT.CHECK eingesetzt werden kann. Lediglich die Darstellung unterscheidet sich. Diese Taste wird sehr häufig mit einem eigenen Icon verwendet. Beispiel: Auswahl einer Textausrichtung Eine Combobox zeigt einen Eintrag aus einer Liste möglicher Einträge an. Der Eintrag kann frei gewählt werden. Je nach Einstellung der Combobox ist sogar die manuelle Eingabe eines Wertes möglich. Die Liste ist normalerweise verborgen und wird erst durch Interaktion mit dem Benutzer sichtbar. Die Klasse CCombo ist eine Combobox, die für die Darstellung in einer Tabellenzelle angepasst wurde. Wie eine Combobox mit der Konstanten SWT.DROP_DOWN erlaubt sie die Selektion aus bestimmten Vorgaben. Hinzu kommt aber noch, dass eine Mehrfachauswahl erlaubt werden kann. Weiterhin ist die maximale Anzahl gleichzeitig sichtbarer Vorgaben einstellbar. Die manuelle Eingabe neuer Werte ist allerdings nicht möglich. Date (SWT.DATE) Das Datumswidget erlaubt nur die Eingabe korrekter Datumswerte. Dieses kann entweder durch eine manuelle Eingabe oder durch Drücken der Tasten neben dem Feld erfolgen. Dieses Widget ist daher für die Datumseingabe einem einfachen Textfeld vorzuziehen. 51

52 3.3 SWT-Widgets Name Date (SWT.TIME) Date (SWT.CALENDAR) Verhalten und Verwendung Das Datumswidget erlaubt durch Setzen der Konstanten SWT.TIME statt einer Datums- eine korrekten Zeiteingabe. Dieses kann entweder durch eine manuelle Eingabe oder durch Drücken der Tasten neben dem Feld erfolgen. Dieses Widget ist daher für die Zeiteingabe einem einfachen Textfeld vorzuziehen. Das Datumswidget erlaubt durch Setzen der Konstanten SWT.CALENDAR die komfortable Auswahl eines Datums aus einem Kalender. Group Eine Gruppe ist ein Container-Objekt, das für Radio-Buttons verwendet wird. Es gruppiert diese logisch und optisch. Es kann immer nur eine Taste dieser Gruppe zu einem Zeitpunkt selektiert sein. Label, CLabel Link List Das Label dient als Erklärung mit einer textuellen Bezeichnung bzw. einem Bild für eine andere Komponente. Es erlaubt keine direkte Eingabe von Werten. Die Klasse CLabel erweitert das normale Label um eine gleichzeitige Darstellung von Bild und Text. Es bietet einen Farbverlauf im Hintergrund, ein Hintergrundbild sowie automatische Textkürzungen, falls der Text zu lang sein sollte. Der Link zeigt einen Text an, innerhalb dessen der auswählbare Teil mit <A>Text</A> markiert ist. So kann z.b. innerhalb eines Textes in einem Dialog ein Verweis auf die zugehörige Hilfe eingebaut werden. Eine List funktioniert ähnlich wie ein Combo-Widget mit der Konstanten SWT.SIMPLE. ProgressBar SWT.SMOOTH ProgressBar SWT.INDETERMINATE Scale ScrollBar Slider Der Fortschrittsbalken wird mit dieser Konstanten verwendet, um den aktuellen Stand einer eine länger laufenden Operation für eine bekannte Anzahl von Schritten bis zum Ende anzuzeigen. Der Fortschrittsbalken wird der Konstanten SWT.INDETERMINATE eingesetzt, um den aktuellen Stand einer eine länger laufenden Operation für eine unbekannte Anzahl an Schritten bis zum Ende anzuzeigen. Der Schieberegler erlaubt die Auswahl eines ganzzahligen Wertes aus einem vorgegebenen Bereich. Der Regler kann sowohl horizontal als auch vertikal angeordnet werden und an vorgegebenen Markierungen einrasten. Scrollbalken lassen sich vertikal und horizontal ausrichten. Normalerweise werden sie nicht direkt erzeugt, sondern durch Angabe einer entsprechenden Konstante beim Erzeugen eines Widgets, dass das Scrollen unterstützt. Bisher wurde in diesem Skript immer ein mehrzeiliges Texteingabefeld verwendet, dessen Inhalt gescrollt werden soll, wenn er zu groß für das Widget ist. Die Scrollbalken können mit Hilfe der Methoden getverticalbar() bzw.gethorizontalbar() ausgelesen werden. Der Schieberegler erlaubt die Auswahl eines ganzzahligen Wertes aus einem vorgegebenen Bereich. Der Regler kann sowohl horizontal als auch vertikal angeordnet werden und an vorgegebenen Markierungen einrasten. 52

53 3.3 SWT-Widgets Name Spinner StyledText Table Text Tree Verhalten und Verwendung Mit Hilfe dieses Widgets lassen sich ganzzahlige Werte bequem einstellen. Es können eine Obergrenze sowie die Schrittweite der Erhöhungen vergeben werden. Dieses Textfeld ist Text sehr ähnlich. Allerdings erlaubt es variable Textattribute. Ein Beispiel dazu ist in Abschnitt zu finden. Die Table erlaubt die tabellarische Darstellung und Eingabe von Daten. Die Art der Darstellung kann vom Entwickler beeinflusst werden. Einzelne Zellen, Spalten, Zeilen oder Bereiche lassen sich auswählen. Die Abschnitte und behandelen die Konzepte (ohne und mit MVC-Ansatz) genauer. Es handelt sich hierbei um ein einzeiliges Freitexteingabefeld mit Cursorsteuerung und Selektion. Variable Textattribute werden nicht unterstützt. Somit haben alle Zeichen dieselbe Größe, Farbe und einen identischen Zeichensatz. Das Textfeld wird auch für Passworteingaben verwendet. Dazu muss die KonstanteSWT.PASSWORD übergeben werden. Ein Tree erlaubt die baumartige Darstellung mit ein- und ausklappbaren Knoten. Die Art der Darstellung kann ähnlich wie bei der Tabelle vom Entwickler beeinflusst werden. Daneben besitzt SWT eine ganze Anzahl weiterer Widgets. So wurde das Composite als Container für andere Widgets bereits vorgestellt. Weitere Container werden später im Abschnitt 3.8 im Skript betrachtet. Interessant ist auch das Canvas-Widget. Innerhalb seiner Fläche kann der Entwickler durch Zeichenoperationen den Inhalt komplett frei gestalten. Weitere Widgets, die bisher nicht Bestandteil von SWT sind, befinden sich im Eclipse-Projekt Nebula (http://www.eclipse.org/nebula/). Abbildung 3.54: Einige Widgets aus dem Nebula-Projekt Aber auch außerhalb der Eclipse-Seiten gibt es viele Widgets, die zum Teil kostenlos verfügbar sind. Ein Beispiel dafür ist die RCPToolbox (http://www.richclientgui. com/detail.php?product_id=1). Sie besitzt unter Anderem ein Widget zur Anzeige von Karten aus Google Maps. 53

Grafische Benutzerschnittstellen

Grafische Benutzerschnittstellen Grafische Benutzerschnittstellen Benjamin Rust 22. Dezember 2006 Software Engineering Projekt Gliederung 1. Teil: Ergonomie und Gestaltung 1. Die ersten GUIs 2. Software-Ergonomie 2.1. ISO 9241-110 2.2.

Mehr

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI Universität Osnabrück Drei-Schichten-Architektur 3 - Objektorientierte Programmierung in Java Vorlesung 6: 3-Schichten-Architektur Fachkonzept - GUI SS 2005 Prof. Dr. F.M. Thiesing, FH Dortmund Ein großer

Mehr

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java

Willkommen zur Vorlesung. Objektorientierte Programmierung Vertiefung - Java Willkommen zur Vorlesung Objektorientierte Programmierung Vertiefung - Java Zum Dozenten Mein Name: Andreas Berndt Diplom-Informatiker (TU Darmstadt) Derzeit Software-Entwickler für Web- Applikationen

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 7. Grafische Benutzeroberflächen 1 Kapitel 7 Ziele 2 (Graphical User Interfaces) als Anwendungsbeispiel für die objektorientierte Programmierung kennenlernen Benutzung von Vererbung zur Erstellung individueller GUI-Klassen durch Erweiterung

Mehr

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum

Starthilfe für C# Inhaltsverzeichnis. Medien- und Kommunikationsinformatik (B.Sc.) Alexander Paharukov. Informatik 3 Praktikum Starthilfe für C# Inhaltsverzeichnis Allgemeines... 2 Bezugsquellen... 2 SharpDevelop... 2.NET Runtime... 2.NET SDK... 2 Installation... 2 Reihenfolge... 2 Vorschlag für eine Ordnerstruktur... 3 Arbeit

Mehr

Microsoft PowerPoint 2013 YouTube-Video einfügen

Microsoft PowerPoint 2013 YouTube-Video einfügen Hochschulrechenzentrum Justus-Liebig-Universität Gießen Microsoft PowerPoint 2013 YouTube-Video einfügen YouTube-Video einfügen in PowerPoint 2013 Seite 1 von 6 Inhaltsverzeichnis Einleitung... 2 Vorbereitungen...

Mehr

2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE

2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE 2. ERSTELLEN VON APPS MIT DEM ADT PLUGIN VON ECLIPSE 2.1 Die Einrichtung der Benutzeroberfläche Das Einrichten einer Android-Eclipse-Entwicklungsumgebung zur Android-Entwicklung ist grundsätzlich nicht

Mehr

eclipse - Entwicklungsumgebung und mehr ETIS SS05

eclipse - Entwicklungsumgebung und mehr ETIS SS05 eclipse - Entwicklungsumgebung und mehr ETIS SS05 Gliederung Motivation Geschichte Architektur Platform Runtime Eclipse Platform Java Development Tools (JDE) Plugin Development Environment (PDE) Zusammenfassung

Mehr

Programmieren I. Die Programmiersprache Java. www.kit.edu. Institut für Angewandte Informatik

Programmieren I. Die Programmiersprache Java. www.kit.edu. Institut für Angewandte Informatik Programmieren I Die Programmiersprache Java KIT Universität des Landes Baden-Württemberg und nationales Großforschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu Eigenschaften von Java Java ist eine

Mehr

Version 0.3. Installation von MinGW und Eclipse CDT

Version 0.3. Installation von MinGW und Eclipse CDT Version 0.3 Installation von MinGW und Eclipse CDT 1. Stellen Sie fest, ob Sie Windows in der 32 Bit Version oder in der 64 Bit Version installiert haben. 2. Prüfen Sie, welche Java Runtime vorhanden ist.

Mehr

Hochschule Niederrhein Grundlagen der Prof. Dr. Nitsche Fachbereich 03 Java Programmierung Bachelor Informatik SS 2015 Übung 1. Grundlagen von Java

Hochschule Niederrhein Grundlagen der Prof. Dr. Nitsche Fachbereich 03 Java Programmierung Bachelor Informatik SS 2015 Übung 1. Grundlagen von Java Grundlagen von Java Aufgabe 1: Typen und Zuweisungen in Java Welche der folgenden Java-Anweisungen sind fehlerhaft? Handelt es sich um einen Compiler- oder einen Laufzeitfehler? Anmerkung: Folgefehler

Mehr

1 Installationen. 1.1 Installationen unter Windows

1 Installationen. 1.1 Installationen unter Windows 1 Installationen Dieses Kapitel beschreibt die Installationen, die für die Nutzung von PHP und MySQL unter Windows, unter Ubuntu Linux und auf einem Mac mit OS X notwendig sind. 1.1 Installationen unter

Mehr

Hello World in Java. Der Weg zum ersten Java-Programm

Hello World in Java. Der Weg zum ersten Java-Programm Vorwort Hello World in Java Der Weg zum ersten Java-Programm Diese Anleitung wurde unter Windows XP verfasst. Grundsätzlich sollte sie auch unter späteren Windows Versionen wie Windows Vista oder Windows

Mehr

Projekt AGB-10 Fremdprojektanalyse

Projekt AGB-10 Fremdprojektanalyse Projekt AGB-10 Fremdprojektanalyse 17. Mai 2010 1 Inhaltsverzeichnis 1 Allgemeines 3 2 Produktübersicht 3 3 Grundsätzliche Struktur und Entwurfsprinzipien für das Gesamtsystem 3 3.1 Die Prefuse Library...............................

Mehr

Software Engineering I

Software Engineering I Software I Übungsblatt 1 + 2 Claas Pinkernell Technische Universität Braunschweig http://www.sse.cs.tu-bs.de/ Seite 2 Welche Werkzeuge? Programmiersprache Java Integrierte Entwicklungsumgebung Eclipse

Mehr

Diese Anleitung bezieht sich auf FixFoto, V 3.40. In älteren oder neueren Versionen könnte die Arbeitsweise anders sein.

Diese Anleitung bezieht sich auf FixFoto, V 3.40. In älteren oder neueren Versionen könnte die Arbeitsweise anders sein. Pfade einstellen Stand: Dezember 2012 Diese Anleitung bezieht sich auf FixFoto, V 3.40. In älteren oder neueren Versionen könnte die Arbeitsweise anders sein. Diese Anleitung soll zeigen, wie man Pfad-Favoriten

Mehr

Objektorientierte Programmierung OOP Programmieren mit Java

Objektorientierte Programmierung OOP Programmieren mit Java Aufgaben: 2 JDK/SDK/JRE und Java Entwicklungswerkzeuge Objektorientierte Programmierung OOP Programmieren mit Java 1. Installation von Java 2. Erstes Java Programm Hello World 3. Dreimal Hallo Olten 2

Mehr

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung

Übersicht. Informatik 2 Teil 3 Anwendungsbeispiel für objektorientierte Programmierung Übersicht 3.1 Modell Konto 3.2 Modell Konto - Erläuterungen 3.3 Benutzer Ein- und Ausgabe mit Dialogfenster I 3.4 Benutzer Ein- und Ausgabe mit Dialogfenster II 3.5 Klassen- und Objekteigenschaften des

Mehr

Zeiterfassung-Konnektor Handbuch

Zeiterfassung-Konnektor Handbuch Zeiterfassung-Konnektor Handbuch Inhalt In diesem Handbuch werden Sie den Konnektor kennen sowie verstehen lernen. Es wird beschrieben wie Sie den Konnektor einstellen und wie das System funktioniert,

Mehr

Grundlagen der Informatik Übungen 1.Termin

Grundlagen der Informatik Übungen 1.Termin Grundlagen der Informatik Übungen 1.Termin Dr. Ing Natalia Currle-Linde Institut für Höchstleistungsrechnen 1 Kurzvorstellung Dr.-Ing. Natalia Currle-Linde linde@hlrs.de Institut für Höchstleistungsrechnen

Mehr

1. BlueJ installieren (nach dem Buch Java lernen mit BlueJ von David J. Barnes; Michael Kölling)

1. BlueJ installieren (nach dem Buch Java lernen mit BlueJ von David J. Barnes; Michael Kölling) 1. BlueJ installieren... 1 2. BlueJ auf die deutsche Version umstellen... 1 3. BlueJ Extensions... 2 a. Klassenkarte... 2 i. UML Extension... 2 ii. Klassenkarte zum Schulbuch... 3 b. CNU BlueJ Code Formatter...

Mehr

Open Source IDE - eclipse ETIS SS04

Open Source IDE - eclipse ETIS SS04 Open Source IDE - eclipse ETIS SS04 Gliederung Motivation Geschichte Architektur Platform Runtime Eclipse Platform Java Development Tools (JDE) Plugin Development Environment (PDE) Zusammenfassung 2 Motivation

Mehr

Erste Schritte zum lauffähigen Java Programm

Erste Schritte zum lauffähigen Java Programm Erste Schritte zum lauffähigen Java Programm Diese kleine Einführung ist eine Hilfe für Studenten der Vorlesung SWT I zur Meisterung der sich ergebenden Hürden bei der Erstellung eines ersten kleinen Java-Programms.

Mehr

Tutorium Java Ein Überblick. Helge Janicke

Tutorium Java Ein Überblick. Helge Janicke Tutorium Java Ein Überblick Helge Janicke 26. Oktober 2000 1 VORRAUSSETZUNGEN ZUM PROGRAMMIEREN MIT JAVA. 1 1 Vorraussetzungen zum Programmieren mit Java. Was braucht man, wenn man mit Java programmieren

Mehr

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH

Autor: Michael Spahn Version: 1.0 1/10 Vertraulichkeit: öffentlich Status: Final Metaways Infosystems GmbH Java Einleitung - Handout Kurzbeschreibung: Eine kleine Einführung in die Programmierung mit Java. Dokument: Autor: Michael Spahn Version 1.0 Status: Final Datum: 23.10.2012 Vertraulichkeit: öffentlich

Mehr

Einführung zu den Übungen aus Softwareentwicklung 1

Einführung zu den Übungen aus Softwareentwicklung 1 Einführung zu den Übungen aus Softwareentwicklung 1 Dipl.-Ing. Andreas Riener Universität Linz, Institut für Pervasive Computing Altenberger Straße 69, A-4040 Linz riener@pervasive.jku.at SWE 1 // Organisatorisches

Mehr

Einführung in die Cross-Plattform Entwicklung Responsive Webdesign mit dem Intel XDK

Einführung in die Cross-Plattform Entwicklung Responsive Webdesign mit dem Intel XDK Einführung in die Cross-Plattform Entwicklung Responsive Webdesign mit dem Intel XDK Einführung Dieses Hands-on-Lab (HOL) macht den Leser mit dem Intel XDK und dem Responsive Webdesign vertraut. Es wird

Mehr

Byte-Taxi. Bedienungsanleitung. Seite 1 von 8

Byte-Taxi. Bedienungsanleitung. Seite 1 von 8 Byte-Taxi Bedienungsanleitung Seite 1 von 8 Inhaltsverzeichnis 1. Beschreibung 3 2. Systemvoraussetzungen 4 3. Installationsanleitung 5 4. Bedienung 6 5. Infos & Kontakt 8 Seite 2 von 8 1. Beschreibung

Mehr

Visual Web Developer Express Jam Sessions

Visual Web Developer Express Jam Sessions Visual Web Developer Express Jam Sessions Teil 1 Die Visual Web Developer Express Jam Sessions sind eine Reihe von Videotutorials, die Ihnen einen grundlegenden Überblick über Visual Web Developer Express,

Mehr

Handbuch TweetMeetsMage

Handbuch TweetMeetsMage Handbuch TweetMeetsMage für Version 0.1.0 Handbuch Version 0.1 Zuletzt geändert 21.01.2012 Inhaltsverzeichnis 1 Einleitung... 3 1.1 Voraussetzungen... 3 1.2 Funktionsübersicht... 3 2 Installation... 4

Mehr

http://www.cis.upenn.edu/~bcpierce/unison/download/stable/unison- 2.9.1/

http://www.cis.upenn.edu/~bcpierce/unison/download/stable/unison- 2.9.1/ Einführung Was ist Unison? Unison ist ein Dateisynchronisationsprogramm für Windows und Unix. Es teilt sich viele Funktionen mit anderen Programmen, wie z.b. CVS und rsync. Folgend einige Vorteile des

Mehr

JAVA. Ein kurzer Überblick. Thomas Karp

JAVA. Ein kurzer Überblick. Thomas Karp JAVA Ein kurzer Überblick Thomas Karp WAS IST JAVA? Java ist eine fast rein objektorientierte Sprache nicht JavaScript eine professionelle Sprache eine im Unterricht weit verbreitete Sprache für verschiedene

Mehr

PIWIN 1 Übung Blatt 5

PIWIN 1 Übung Blatt 5 Fakultät für Informatik Wintersemester 2008 André Gronemeier, LS 2, OH 14 Raum 307, andre.gronemeier@cs.uni-dortmund.de PIWIN 1 Übung Blatt 5 Ausgabedatum: 19.12.2008 Übungen: 12.1.2009-22.1.2009 Abgabe:

Mehr

DocuWare unter Windows 7

DocuWare unter Windows 7 DocuWare unter Windows 7 DocuWare läuft unter dem neuesten Microsoft-Betriebssystem Windows 7 problemlos. Es gibt jedoch einige Besonderheiten bei der Installation und Verwendung von DocuWare, die Sie

Mehr

RIWA NetUpdater Tool für automatische Daten- und Softwareupdates

RIWA NetUpdater Tool für automatische Daten- und Softwareupdates RIWA NetUpdater Tool für automatische Daten- und Softwareupdates Grundlegendes... 1 Ausführbare Dateien und Betriebsmodi... 2 netupdater.exe... 2 netstart.exe... 2 netconfig.exe... 2 nethash.exe... 2 Verzeichnisse...

Mehr

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Einführung in Java PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005 Gliederung 1. Was ist Java / Geschichte von Java 2. Prinzip der Plattformunabhängigkeit 3. Wie kommt man vom Quellcode zum Programm

Mehr

Installation Guide. Installation Guide. Installationsanleitung für die anaptecs JEAF Plattform. Version 1.2 Letzte Änderung 05.

Installation Guide. Installation Guide. Installationsanleitung für die anaptecs JEAF Plattform. Version 1.2 Letzte Änderung 05. Installation Guide Thema Version 1.2 Letzte Änderung 05. Dezember 2011 Status Installationsanleitung für die anaptecs JEAF Plattform Freigegeben Inhaltsverzeichnis 1 Motivation... 4 1.1 Abgrenzungen...

Mehr

INSTALLATION und BENUTZUNG von REAL VNC 3.3.5-7

INSTALLATION und BENUTZUNG von REAL VNC 3.3.5-7 INSTALLATION und BENUTZUNG von REAL VNC 3.3.5-7 Einleitung: Real VNC ist ein Remote Programm das zur Fernwartung von PCs über das Internet verwendet werden kann. It is fully cross-platform das heißt man

Mehr

Zum Abschluss wird gezeigt, wie aus einem C++ Quell-Programm ein ausführbares Programm erzeugt wird. 1. Installation von NetBeans...

Zum Abschluss wird gezeigt, wie aus einem C++ Quell-Programm ein ausführbares Programm erzeugt wird. 1. Installation von NetBeans... Erste Schritte Dieser Teil der Veranstaltung gibt einen ersten Eindruck der Programmierung mit C++. Es wird ein erstes Gefühl von Programmiersprachen vermittelt, ohne auf die gezeigten Bestandteile genau

Mehr

Java Einführung Programmcode

Java Einführung Programmcode Java Einführung Programmcode Inhalt dieser Einheit Programmelemente Der erste Programmcode Die Entwicklungsumgebung: Sun's Java Software Development Kit (SDK) Vom Code zum Ausführen des Programms 2 Wiederholung:

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Kapitel 6. Vererbung

Kapitel 6. Vererbung 1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben

Mehr

Installation und Benutzung AD.NAV.ZipTools

Installation und Benutzung AD.NAV.ZipTools Installation und Benutzung AD.NAV.ZipTools Version 1.0.0.0 ALTENBRAND Datentechnik GmbH Am Gelicht 5 35279 Neustadt (Hessen) Tel: 06692/202 290 Fax: 06692/204 741 email: support@altenbrand.de Die Komponente

Mehr

1 Websites mit Frames

1 Websites mit Frames 1 Websites mit Frames Mehrere Seiten in einer einzelnen Seite anzeigen - Was sind Frames und wie funktionieren sie? - Was sind die Vor- und Nachteile von Frames? - Wie erstellt man eine Frames- Webseite?

Mehr

Installation und Dokumentation. juris Autologon 3.1

Installation und Dokumentation. juris Autologon 3.1 Installation und Dokumentation juris Autologon 3.1 Inhaltsverzeichnis: 1. Allgemeines 3 2. Installation Einzelplatz 3 3. Installation Netzwerk 3 3.1 Konfiguration Netzwerk 3 3.1.1 Die Autologon.ini 3 3.1.2

Mehr

Installieren und Einrichten von VirtualBox für TAPPS (V1.0)

Installieren und Einrichten von VirtualBox für TAPPS (V1.0) Installieren und Einrichten von VirtualBox für TAPPS (V1.0) 1 Einleitung... 2 2 Download und Installation... 2 3 Einrichten von VirtualBox am Beispiel Windows XP... 7 4 Einrichten von Windows XP... 26

Mehr

Benutzerdokumentation Web-Portal

Benutzerdokumentation Web-Portal GRUPP: SWT0822 Benutzerdokumentation Web-Portal Yet Another Reversi Game Martin Gielow, Stephan Mennicke, Daniel Moos, Christine Schröder, Christine Stüve, Christian Sura 05. Mai 2009 Inhalt 1. Einleitung...3

Mehr

1. Java Grundbegriffe

1. Java Grundbegriffe 1. Java Grundbegriffe Geschichte von Java Programmieren mit Java Interpretieren vs. Kompilieren Java Byte-Code Jave Virtual Machine Arbeitsmaterialien Allgemeine Informatik 2 SS09 Folie 1.1 Java, eine

Mehr

Vorkurs C++ Programmierung

Vorkurs C++ Programmierung Vorkurs C++ Programmierung Klassen Letzte Stunde Speicherverwaltung automatische Speicherverwaltung auf dem Stack dynamische Speicherverwaltung auf dem Heap new/new[] und delete/delete[] Speicherklassen:

Mehr

VB.net Programmierung und Beispielprogramm für GSV

VB.net Programmierung und Beispielprogramm für GSV VB.net Programmierung und Beispielprogramm für GSV Dokumentation Stand vom 26.05.2011 Tel +49 (0)3302 78620 60, Fax +49 (0)3302 78620 69, info@me-systeme.de, www.me-systeme.de 1 Inhaltsverzeichnis Vorwort...2

Mehr

OpenSSH installieren (Windows) Was ist OpenSSH?

OpenSSH installieren (Windows) Was ist OpenSSH? OpenSSH installieren (Windows) Was ist OpenSSH? OpenSSH (Open Secure Shell) ist eine freie SSH/SecSH-Protokollsuite, die Verschlüsselung für Netzwerkdienste bereitstellt, wie etwa Remotelogins, also Einloggen

Mehr

INSTALLATION. Voraussetzungen

INSTALLATION. Voraussetzungen INSTALLATION Voraussetzungen Um Papoo zu installieren brauchen Sie natürlich eine aktuelle Papoo Version die Sie sich auf der Seite http://www.papoo.de herunterladen können. Papoo ist ein webbasiertes

Mehr

TCP/IP Programmierung. C# TimeServer Java6 TimeClient

TCP/IP Programmierung. C# TimeServer Java6 TimeClient TCP/IP Programmierung C# TimeServer Java6 TimeClient Stand 19.10.11 21:24:32 Seite 1 von 16 Inhaltsverzeichnis Erläuterung...3 Software...3 C#TimeServer...4 Klasse ServerThread...6 Starten und Beenden...7

Mehr

Java: Vererbung. Teil 3: super() www.informatikzentrale.de

Java: Vererbung. Teil 3: super() www.informatikzentrale.de Java: Vererbung Teil 3: super() Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und IMMER zuerst den Konstruktor der Elternklasse auf! Konstruktor und Vererbung Kindklasse ruft SELBSTSTÄNDIG und

Mehr

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler Programmieren für mobile Endgeräte SS 2013/2014 Programmieren für mobile Endgeräte 2 Besprechung der Aufgaben 1) Legen Sie das Android-Projekt HelloWorldApp an so wie es in den vorherigen Folien beschrieben

Mehr

Installationsanleitung Expertatis

Installationsanleitung Expertatis Installationsanleitung Expertatis 1. Komplettinstallation auf einem Arbeitsplatz-Rechner Downloaden Sie die Komplettinstallation - Expertatis_Komplett-Setup_x32.exe für ein Windows 32 bit-betriebssystem

Mehr

1. Einführung. 2. Vorbereitung zur Installation. 1.1 Eclipse

1. Einführung. 2. Vorbereitung zur Installation. 1.1 Eclipse 1. Einführung 1.1 Eclipse Die Eclipse ist eine kostenlose integrierte Entwicklungsumgebung oder auch IDE genannt, (Abkürzung IDE, engl. Integrated development enviroment). Sie ist eine grafische Benutzeroberfläche

Mehr

Baqué und Lauter GmbH 02255 / 950300 Falkenweg 3 Fax 02255 / 950303 53881 Euskirchen

Baqué und Lauter GmbH 02255 / 950300 Falkenweg 3 Fax 02255 / 950303 53881 Euskirchen Baqué und Lauter GmbH 02255 / 950300 Falkenweg 3 Fax 02255 / 950303 53881 Euskirchen Anleitung für die Installation ein Netzwerks unter Windows 95,98,Me,2000. Netzwerke können auf sehr unterschiedliche

Mehr

Programmieren I. Die Programmiersprache Java. www.kit.edu. Institut für Angewandte Informatik

Programmieren I. Die Programmiersprache Java. www.kit.edu. Institut für Angewandte Informatik Programmieren I Die Programmiersprache Java KIT Universität des Landes Baden-Württemberg und nationales Großforschungszentrum in der Helmholtz-Gemeinschaft www.kit.edu Eigenschaften von Java Java ist eine

Mehr

Smartphone Entwicklung mit Android und Java

Smartphone Entwicklung mit Android und Java Smartphone Entwicklung mit Android und Java predic8 GmbH Moltkestr. 40 53173 Bonn Tel: (0228)5552576-0 www.predic8.de info@predic8.de Was ist Android Offene Plattform für mobile Geräte Software Kompletter

Mehr

Serverumzug mit Win-CASA

Serverumzug mit Win-CASA Serverumzug mit Win-CASA Wenn Sie in Ihrem Netzwerk einen Umzug der Server-Version durchführen müssen, sollten Sie ein paar Punkte beachten, damit dies ohne Probleme abläuft. 1. Nachweis-Ordner In der

Mehr

6.3 Ereignisgesteuerte Programmierung

6.3 Ereignisgesteuerte Programmierung 6.3 Ereignisgesteuerte Programmierung Im Gegensatz zur klassischen Programmierung geht man bei der ereignisgesteuerten Programmierung davon aus, dass ein Programm immer aktiv bleibt, bis es explizit beendet

Mehr

IMBA. Installationsanleitung. SQL Server-Datenbankadapter. Das Instrument für den fähigkeitsgerechten Personaleinsatz

IMBA. Installationsanleitung. SQL Server-Datenbankadapter. Das Instrument für den fähigkeitsgerechten Personaleinsatz Das Instrument für den fähigkeitsgerechten Personaleinsatz IMBA SQL Server-Datenbankadapter Installationsanleitung gefördert durch das Bundesministerium für Gesundheit und Soziale Sicherung Vorbereitung

Mehr

Programmierprojekt Aufgabe 1

Programmierprojekt Aufgabe 1 v01 10.05.2009 Die Formalitäten vorab (WICHTIG!!!): Technische Universität Darmstadt Fachbereich Informatik Prof. Dr. Johannes Fürnkranz Allgemeine Informatik 2 im SS 2009 Programmierprojekt Aufgabe 1

Mehr

3.9 Grundelemente einer Benutzeroberfläche

3.9 Grundelemente einer Benutzeroberfläche 92 3 Grundlagen einer ios-anwendung 3.8.4 Target-Actions Einer der häufigsten Anwendungsfälle bei einer Oberfläche ist das Betätigen einer Schaltfläche durch einen Anwender, woraufhin eine bestimmte Aktion

Mehr

PADS 3.0 Viewer - Konfigurationen

PADS 3.0 Viewer - Konfigurationen PADS 3.0 Viewer - Konfigurationen Net Display Systems (Deutschland) GmbH - Am Neuenhof 4-40629 Düsseldorf Telefon: +49 211 9293915 - Telefax: +49 211 9293916 www.fids.de - email: info@fids.de Übersicht

Mehr

Christian Kurz SWT Projekt WS 07/08

Christian Kurz SWT Projekt WS 07/08 Christian Kurz SWT Projekt WS 07/08 1. Allgemeine Aspekte der generativen GUI- Entwicklung 2. Entwicklung mit Hilfe von GUI-Designern 3. Entwicklung mit Hilfe deklarativer GUI- Sprachen 4. Modellgetriebene

Mehr

AJAX SSL- Wizard Referenz

AJAX SSL- Wizard Referenz AJAX SSL- Wizard Referenz Version 1.0.2+ - 04.04.2011 Präambel Die vorliegende Dokumentation beschreibt den AJAX basierten SSL- Wizard der CertCenter AG. Der SSL- Wizard kann mit wenigen Handgriffen nahtlos

Mehr

Anleitung zum Applet Schiefer Wurf

Anleitung zum Applet Schiefer Wurf Anleitung zum Applet: Schiefer Wurf 1 Anleitung zum Applet Schiefer Wurf Bearbeitung von: Mathias Hartner SS 2009 Studiengang: Elektronik und Informationstechnik Betreuung durch: Prof. Dr. Wilhelm Kleppmann

Mehr

Anleitung zur Aktualisierung

Anleitung zur Aktualisierung CONTREXX AKTUALISIERUNG 2010 COMVATION AG. Alle Rechte vorbehalten. Diese Dokumentation ist urheberrechtlich geschützt. Alle Rechte, auch die der Modifikation, der Übersetzung, des Nachdrucks und der Vervielfältigung,

Mehr

Programmieren in Java

Programmieren in Java Programmieren in Java objektorientierte Programmierung 2 2 Zusammenhang Klasse-Datei In jeder *.java Datei kann es genau eine public-klasse geben wobei Klassen- und Dateiname übereinstimmen. Es können

Mehr

Erste Schritte in der Benutzung von Microsoft SharePoint 2010

Erste Schritte in der Benutzung von Microsoft SharePoint 2010 Erste Schritte in der Benutzung von Microsoft SharePoint 2010 Inhalt 1. Einleitung... 1 2. Browserwahl und Einstellungen... 1 3. Anmeldung und die Startseite... 3 4. Upload von Dokumenten... 3 5. Gemeinsamer

Mehr

Anleitung zur Webservice Entwicklung unter Eclipse

Anleitung zur Webservice Entwicklung unter Eclipse Entwicklungsumgebung installieren Sofern Sie nicht an einem Praktikumsrechner arbeiten, müssen Sie ihre Eclipse-Umgebung Webservice-fähig machen. Dazu benötigen Sie die Entwicklungsumgebung Eclipse for

Mehr

a) WebDav-Laufwerk einrichten (Windows Vista, W7, W8) Seite 2

a) WebDav-Laufwerk einrichten (Windows Vista, W7, W8) Seite 2 DIANIZER 3.0 WEB einrichten Inhalt a) WebDav-Laufwerk einrichten (Windows Vista, W7, W8) Seite 2 b) Dianizer WEB einrichten Seite 5 b1) Rufen Sie Ihre Wunsch-Subdomain auf. Seite 5 b2) Melden Sie sich

Mehr

Mobile Application Development

Mobile Application Development Mobile Application Development Android: Einführung Jürg Luthiger University of Applied Sciences Northwestern Switzerland Institute for Mobile and Distributed Systems Lernziele Der/die Kursbesucher/in kann

Mehr

Installation von Updates

Installation von Updates Installation von Updates In unregelmässigen Abständen erscheinen Aktualisierungen zu WinCard Pro, entweder weil kleinere Verbesserungen realisiert bzw. Fehler der bestehenden Version behoben wurden (neues

Mehr

2 Fenster - Hauptelement des GUI

2 Fenster - Hauptelement des GUI Einführung in die objektorientierte Programmierung mit C# 13 2 Bei der Arbeit mit Computern erwarten die Nutzer eine komfortable Bedienung über eine eine»grafische Oberfläche«(engl.: graphical user interface

Mehr

DDBAC-SDK unter Linux (mit Wine) Installationsanleitung

DDBAC-SDK unter Linux (mit Wine) Installationsanleitung DDBAC-SDK unter Linux (mit Wine) Installationsanleitung Installation von Wine Einleitung Übersicht Titel Thema Datei DDBAC-SDK unter Linux (mit Wine) Installationsanleitung DDBAC_Wine_Installation.doc

Mehr

Technische Dokumentation SEPPmail Outlook Add-In v1.5.3

Technische Dokumentation SEPPmail Outlook Add-In v1.5.3 Technische Dokumentation SEPPmail Outlook Add-In v1.5.3 In diesem Dokument wird dargelegt, wie das SEPPmail Outlook Add-in funktioniert, und welche Einstellungen vorgenommen werden können. Seite 2 Inhalt

Mehr

Java Forum Stuttgart 2008

Java Forum Stuttgart 2008 Professionelle Open Source SOA in 45 Minuten! Java Forum Stuttgart 2008 Dr. Halil-Cem Gürsoy, CDI AG Der Referent Insgesamt ca. 10 Jahre Beratung, davor Forschung Senior Consultant - JEE Evangelist Hauptsächlich

Mehr

Anleitung: Installation von orgamax auf einem MAC

Anleitung: Installation von orgamax auf einem MAC Anleitung: Installation von orgamax auf einem MAC Lieber orgamax Anwender, orgamax ist eine WIndows-Anwendung und lässt sich somit nicht direkt auf einem Macintosh mit einem MacOS Betriebssystem installieren.

Mehr

Einführung in die Cross-Plattform Entwicklung Das Intel App Framework

Einführung in die Cross-Plattform Entwicklung Das Intel App Framework Einführung in die Cross-Plattform Entwicklung Das Intel App Framework Einführung Dieses Hands-on-Lab (HOL) macht den Leser mit dem Intel App Framework vom Intel XDK vertraut. Es wird Schritt für Schritt

Mehr

Der Editor und seine Funktionen

Der Editor und seine Funktionen Der Editor und seine Funktionen Für die Eingabe und Änderung von Texten steht Ihnen im Pflegemodus ein kleiner WYSIWYG-Editor zur Verfügung. Tinymce 1 ist ein Open Source Javascript-Editor, der mittlerweile

Mehr

Benutzerhandbuch. Gästebuch Software - YellaBook v1.0 http://www.yellabook.de. Stand: 01.08.2012. by YellaBook.de - Alle Rechte vorbehalten.

Benutzerhandbuch. Gästebuch Software - YellaBook v1.0 http://www.yellabook.de. Stand: 01.08.2012. by YellaBook.de - Alle Rechte vorbehalten. Benutzerhandbuch Gästebuch Software - YellaBook v1.0 http://www.yellabook.de Stand: 01.08.2012 Inhalt 1 Funktionen... 3 2 Systemanforderungen... 4 3 Installation... 4 4 Einbinden des Gästebuchs... 5 5

Mehr

Bin ich fit für myconvento?

Bin ich fit für myconvento? Bin ich fit für myconvento? Sie planen den Einsatz unserer innovativen Kommunikationslösung myconvento und fragen sich gerade, ob Ihr Rechner die Anforderungen erfüllt? Hier erfahren Sie mehr. Inhalt Was

Mehr

White Paper. Embedded Treiberframework. Einführung

White Paper. Embedded Treiberframework. Einführung Embedded Treiberframework Einführung White Paper Dieses White Paper beschreibt die Architektur einer Laufzeitumgebung für Gerätetreiber im embedded Umfeld. Dieses Treiberframework ist dabei auf jede embedded

Mehr

Installation von Typo3 CMS

Installation von Typo3 CMS Installation von Typo3 CMS TYPO3 Version 6.2.x unter Windows Eigenen lokalen Webserver mit XAMPP installieren Für die Installation von Typo3 wird eine passende Systemumgebung benötig. Diese besteht aus

Mehr

Managed VPSv3 Was ist neu?

Managed VPSv3 Was ist neu? Managed VPSv3 Was ist neu? Copyright 2006 VERIO Europe Seite 1 1 EINFÜHRUNG 3 1.1 Inhalt 3 2 WAS IST NEU? 4 2.1 Speicherplatz 4 2.2 Betriebssystem 4 2.3 Dateisystem 4 2.4 Wichtige Services 5 2.5 Programme

Mehr

Collax E-Mail Archive Howto

Collax E-Mail Archive Howto Collax E-Mail Archive Howto Howto Dieses Howto beschreibt wie ein Collax Server innerhalb weniger Schritte als E-Mail Archive eingerichtet werden kann, um Mitarbeitern Zugriff auf das eigene E-Mail Archiv

Mehr

Handbuch DrahtexLabelwriter 3.0

Handbuch DrahtexLabelwriter 3.0 Handbuch DrahtexLabelwriter 3.0 Inhaltsverzeichnis INSTALLATION 3 DER PROGRAMMSTART 7 DIE PROGRAMMOBERFLÄCHE 8 DIE STARTSEITE DES PROGRAMMES 8 DIE PROGRAMMSYMBOLLEISTE 9 EIN NEUES PROJEKT ERSTELLEN 10

Mehr

Leica DISTO Transfer Wie verbinde ich meinen Leica DISTO mit meinem PC

Leica DISTO Transfer Wie verbinde ich meinen Leica DISTO mit meinem PC Wie verbinde ich meinen Leica DISTO mit meinem PC PC, Labtop 2 Tablet PC, UMPC Installation 1. Bitte laden Sie die aktuellste Version der Leica DISTO Transfer Software auf unserer Homepage herunter: http://ptd.leica-geosystems.com/en/support-downloads_6598.htm?cid=11104

Mehr

Installationsanleitung Tivoli Storage Manager für Linux

Installationsanleitung Tivoli Storage Manager für Linux 11. März 2009, Version 1.0 Installationsanleitung für Linux Verwaltungsdirektion Informatikdienste Installationsanleitung für Linux Inhaltsverzeichnis...1 Installation... 1 Voraussetzungen...1 Ablauf der

Mehr

Novell Filr Inhaltsverzeichnis

Novell Filr Inhaltsverzeichnis Novell Filr Inhaltsverzeichnis 1. Webanwendung...2 1.1 Aufbau...2 1.2 Funktionen...2 1.2.1 Meine Dateien...2 1.2.2 Für mich freigegeben...3 1.2.3 Von mir freigegeben...4 1.2.4 Netzwerkordner...4 1.2.5

Mehr

RÖK Typo3 Dokumentation

RÖK Typo3 Dokumentation 2012 RÖK Typo3 Dokumentation Redakteur Sparten Eine Hilfe für den Einstieg in Typo3. Innpuls Werbeagentur GmbH 01.01.2012 2 RÖK Typo3 Dokumentation Inhalt 1) Was ist Typo3... 3 2) Typo3 aufrufen und Anmelden...

Mehr

Bedienungsanleitung. Version 2.0. Aufruf des Online-Update-Managers. Bedienungsanleitung Online-Update Stand Juni 2010

Bedienungsanleitung. Version 2.0. Aufruf des Online-Update-Managers. Bedienungsanleitung Online-Update Stand Juni 2010 Bedienungsanleitung Online-Update Version 2.0 Aufruf des Online-Update-Managers Von Haus aus ist der Online-Update-Manager so eingestellt, dass die Updates automatisch heruntergeladen werden. An jedem

Mehr

FH LU JEE Vorlesung SS 2010. Ralf Gitzel ralf_gitzel@hotmail.de

FH LU JEE Vorlesung SS 2010. Ralf Gitzel ralf_gitzel@hotmail.de FH LU JEE Vorlesung SS 2010 Ralf Gitzel ralf_gitzel@hotmail.de 1 Einführung + Organisatorisches Ralf Gitzel ralf_gitzel@hotmail.de 2 Dozent Dr. Ralf Gitzel Promotion an der Universität Mannheim in Wirtschaftsinformatik

Mehr

G-Info Lizenzmanager

G-Info Lizenzmanager G-Info Lizenzmanager Version 4.0.1001.0 Allgemein Der G-Info Lizenzmanager besteht im wesentlichen aus einem Dienst, um G-Info Modulen (G-Info Data, G-Info View etc.; im folgenden Klienten genannt) zentral

Mehr

WinSCP Zugriff auf Daten des Uni-Netzwerkes

WinSCP Zugriff auf Daten des Uni-Netzwerkes WinSCP Zugriff auf Daten des Uni-Netzwerkes Robert Hillig 2013/03 1. Vorwort Das Universitätsnetzwerk ist von außen per SSH (Secure SHell) über login.tu-chemnitz.de auf Port 22 erreichbar. SSH ist ein

Mehr

Installationsanleitung MS SQL Server 2005. für Sage 50 Ablage & Auftragsbearbeitung. Sage Schweiz AG D4 Platz 10 CH-6039 Root Längenbold

Installationsanleitung MS SQL Server 2005. für Sage 50 Ablage & Auftragsbearbeitung. Sage Schweiz AG D4 Platz 10 CH-6039 Root Längenbold Installationsanleitung MS SQL Server 2005 für Sage 50 Ablage & Auftragsbearbeitung Sage Schweiz AG D4 Platz 10 CH-6039 Root Längenbold Inhaltsverzeichnis 1. GRUNDSÄTZLICHES... 3 2. SQLExpress Installationsanleitung

Mehr

FlowFact Alle Versionen

FlowFact Alle Versionen Training FlowFact Alle Versionen Stand: 29.09.2005 Brief schreiben, ablegen, ändern Die FlowFact Word-Einbindung macht es möglich, direkt von FlowFact heraus Dokumente zu erzeugen, die automatisch über

Mehr