Java 1
  • Home
  • Tutorials
    • Hello World
      • Download
      • Installation unter Windows
      • Installation unter Linux
      • Das Hello World Programm
      • Mehr Java
    • Java Konsole
      • Java Konsole Testen
    • Basic Java
      • Java Programme
        • Die Klasse
        • Datentypen
        • Null
        • Casten
        • Operatoren
        • Kontrollstrukturen
        • Arrays
        • Aufgaben
      • Objektorientierte Konzepte
        • Hallo Fenster
        • Objekte einer Klasse
        • Vererbung
        • Interfaces
      • Alles über Klassen
        • Abstrakte Klassen
        • Methoden überschreiben
        • Super
        • Final
        • Innere Klassen
        • Anonyme Klassen
        • Enumerations
      • You're just an object
        • Sichtbarkeit
        • Druckdarstellung
        • Gleichheit
        • Klonen
        • Die Class
        • Serialisierung
    • Java Api
      • Dokumentation
      • Strings
      • Wrapper Klassen
      • System und Runtime
      • Math
      • Exceptions
      • IO
      • Sammlungsklassen
      • AWT und Swing
      • Alle Komponenten
      • Applets
      • Threads
      • Jar
      • Classpath
    • JSP und Servlets
      • Meine erste JSP
        • Downloads
        • Installation unter Windows
        • Installation unter Linux
        • Admin und Manager
        • Webapplication
      • JSP
        • Java Code in HTML einbinden
        • Das HTTP Request - Response Modell
        • Request und Response Objekte
        • Auswerten von Formulardaten
        • Aufgaben
      • Beans
        • Die Session
        • Weitere vordefinierte Objekte
        • Java-Beans
        • Beans programmieren
        • Java-Beans in JSP nutzen
        • Aufgaben
      • Servlets
        • Nutzen der Servlets
        • Servlets programmieren
        • Servlets auf dem Server einrichten
        • Servlets mit JSP
        • Servlets includen
        • Aufgaben
      • Webapplikation
        • Filter
        • Initialisierungsparameter
        • Error Pages
        • Passwortgeschützte Verzeichnisse
        • Bibliotheken nutzen
        • Eine Webapplikation deployen
        • Ausblick: Wie geht's weiter?
        • JSP-Tags Syntaxreferenz
        • Aufgaben
  • Code
    • Web
      • Datenbankverbindungen mit Tomcat
      • Texte richtig encoden
      • HTTPS mit Tomcat
      • HTML Encoden mit Javascript
    • Java
      • Print F
      • Ein generischer Poolbuilder
      • Native Bibliotheken
      • Unique Ids
    • Java FX
      • Balls
      • Hearts
      • Planner
    • Java ME
      • The Next Big Thing
    • System
      • Vi Kommandos
  • Sidemap
  • Impressum
  • Hilfe
Home > Tutorials > Java Api > AWT und Swing
  • Home
  • Tutorials
    • Hello World
    • Java Konsole
    • Basic Java
    • Java Api
      • Dokumentation
      • Strings
      • Wrapper Klassen
      • System und Runtime
      • Math
      • Exceptions
      • IO
      • Sammlungsklassen
      • AWT und Swing
      • Alle Komponenten
      • Applets
      • Threads
      • Jar
      • Classpath
    • JSP und Servlets
  • Code
  • Sidemap
  • Impressum
  • Hilfe

AWT und Swing

Während andere Programmiersprachen nur mit größter Mühe ein hässliches Fenster auf den Bildschirm bringen, bietet Java gleich zwei plattformunabhängige Toolkits für grafische Benutzerschnittstellen an. Zwei sind natürlich im Grunde eins zuviel, und tatsächlich hat diese Fülle historische Gründe.

Das AWT (Abstract Window Toolkit) in den Paketen java.awt.* und seinen Unterpakte wurde bereits mit der ersten Java Version eingeführt. Es nutzt die Grafikfunktionalität des jeweiligen Betriebssystems, so dass entsprechende Java-Fenster von nativen Fenstern des Rechners kaum zu unterscheiden sind. Es bietet allerdings nur Komponenten an, die auf allen unterstützten Systemen auch sicher vorhanden sind. Daher gibt es im AWT keine Tabellen, Bäume und auch keinen Directory Dialog.

Der Mangel wurde bald offenbar, sodass ab Java 1.2 ein weiteres Toolkit zur Verfügung steht, die „JFC" (Java Foundation Classes) oder „Swing". Sie finden Swing in den Paketen javax.swing.* und Unterpakete. Swing benutzt nur Zeichenfunktionen, um Komponenten zu realisieren, und ist dadurch unabhängig vom Betriebssystem und ausgesprochen leistungsfähig. Natürlich hat Swing auch einen Nachteil: Es reagiert im Vergleich zu nativem Code relativ langsam und hat damit nicht unerheblich zum negativen Ruf von Java als „langsamer Sprache" beigetragen. Glücklicherweise hat sich das Thema aufgrund der fortgeschrittenen Hardware heute weitgehend erledigt. Rufen Sie einmal die Swing-Demo „SwingSet2" des JDK auf und verschaffen Sie sich einen Eindruck von Swing. (JAVA_HOME/­demo/jfc/SwingSet2/SwingSet2.jar).

Wir haben uns entschieden, in diesem Anfängerkurs AWT zuverwenden, da wir der Auffassung sind, dass man beide Toolkits kennen sollte. AWT ist unserer Auffassung nach einfacher zu erlernen, da einige komplizierte Swing – Komponenten fehlen und die AWT-Klassenhierarchie übersichtlicher ist. Das meiste von dem, was sie bei AWT lernen, werden Sie auch bei Swing verwenden können, da die Programmierung beider Toolkits glücklicherweise relativ ähnlich ist.

Benutzeroberflächen bauen

Benutzerschnittstellen werden recht einfach gebaut, indem man zu Containern Komponenten hinzufügt. Dazu bieten Container die Methode add(..) an:

Wenn Sie die Beispiele laufen lassen, stellen Sie fest, dass die Buttons den gesamten Raum des Fensters einnehmen. Das ist in der Regel nicht gewünscht. Um mehrere Komponenten in einem Containersinnvoll zu verteilen, verwendet man daher Layout-Manager.

Layoutmanager

Layoutmanager ordnen mehrere Komponenten in einem Container an. Java kennt zur Zeit folgende Layoutmanager, die in java.awt.* untergebracht sind und sich sowohl für Swing als auch für das AWT eignen:

FlowLayout:

FlowLayout ordnet die Komponenten einfach hintereinander an. Dabei werden die Methoden getPreferredSize(), getMaximumSize() und getMinimumSize() der Komponente aus java.awt.Component aufgerufen um festzustellen, wie gross eine Komponente gerne wäre. In unserem Beispiel sieht das noch ganz gut aus, weil alle Komponenten gleich groß sind.

/**
 * FlowLayout Panel bauen.
 */
private Panel getFlowLayoutPanel() {
	Panel panel=new Panel(new FlowLayout());
	for (int i=0;i< 10;i++) {
		panel.add(getButton("Button "+i));
	}
	return panel;
}

Bitte finden Sie den Code des gesamten Beispiels unten in java1.bsp.referenz.LayoutManagerDemo.java. Starten Sie das Programm und betrachten Sie da jeweiligeLayout. Verändern Sie die Grösse des Hauptfensters um zusehen, wie der Layoutmanager sich verhält.

GridLayout:

Das “Gitter-Layout” nutzt den gesamten Platz und teilt jederKindkomponente gleich viel davon zu. Bei der Erzeugung dieses Layout-Managers geben Sie an, wie viele Zeilen und Spalten Siewünschen. Die Komponenten werden dann ohne weiteres hinzugefügt:

Panel panel=new Panel(new GridLayout(3,4));
for (int i=0;i< 12;i++) {
     panel.add(getButton("Button "+i));
}

BorderLayout:

Der BorderLayout-Manager wird sehr häufig verwendet. Ereignet sich gut für das Hauptfenster einer Applikation, weil er nur die zentrale Fläche vergrößert, während alle anderen Flächen nahezu gleich bleiben. Sie können hier ohne weiteres auch Flächen leer lassen.

Panel panel = new Panel(new BorderLayout());
	
// Bei jedem Hinzufügen die Position angeben
panel.add(getButton("NORTH"),BorderLayout.NORTH);
panel.add(getButton("SOUTH"),BorderLayout.SOUTH);
panel.add(getButton("WEST"),BorderLayout.WEST);
panel.add(getButton("EAST"),BorderLayout.EAST);
panel.add(getButton("CENTER"),BorderLayout.CENTER);

Wie Sie sehen, geben Sie die gewünschte Position der Komponenten durch die benannten Konstanten (BorderLayout.CENTER usw.) an. Die Reihenfolge ist hier unerheblich.

CardLayout:

Das CardLayout erlaubt es, mehrere Komponenten hintereinander anzuordnen und jeweils eines davon anzuzeigen. Dabei muss die Komponente sowohl dem Layoutmanager als auch dem betreffenden Container hinzugefügt werden:

// Das Panel dem Layoutmanager bekanntgeben
cardLayout.addLayoutComponent(panel,name);
// Das Panel zum umgebenden Container hinzufügen
 mainPanel.add(panel,name);

Umgeschaltet zwischen den einzelnen Komponenten wird von Hand; in unserem Beispiel wird dies über den ItemListener realisiert:

/**
* Der Listener schaltet das CardLayout um
*/
public void itemStateChanged(ItemEvent e) {
    cardLayout.show(mainPanel,group.getSelectedCheckbox().getLabel());
}

Das CardLayout wird heute nur noch selten verwendet. Hier gibt es in Swing das javax.swing.JTabbedPane, das die gesamte hier umständlich von Hand programmierte Funktionalität des Umschaltens bereits zur Verfügung stellt.

GridBagLayout:

GridBagLayout ist ein anspruchsvoller Layout-Manager, der aufwändig zu programmieren ist. Er realisiert in etwa eine HTMLTabelle, wobei die Zellen Komponenten aufnehmen können. Wie in HTML können sich Zellen über mehrere Zeilen oder Reihen erstrecken. Nachdem Sie den Layout-Manager erzeugt haben, erzeugen Sie ein java.awt.GridBagConstraints, das die Eigenschaften der Platzierung der hinzuzufügenden Komponente enthält:

Panelpanel=new Panel(new GridBagLayout()); 
GridBagConstraints c=newGridBagConstraints();

In den GridBagConstraints können eine ganze Reihe von Eigenschaften gesetzt werden.

// Sollen die Komponenten verändert werden, wenn das Fenster
// vergrössert wird? .NONE, .VERTICAL,.HORIZONTAL,.BOTH
c.fill=GridBagConstraints.BOTH;
// Größe der leeren Ränder um die Komponenten
c.insets=new Insets(5,5,5,5);

// Position des ersten Buttons
c.gridx=0;c.gridy=0;
// Anzahl der Felder, die es einnehmen soll
c.gridwidth=4;c.gridwidth=4;
// Komponente bekommt die gesamte Größenveränderung
// Achtung: mindestens einmal im Layout 
// muss sie gesetzt werden
c.weightx=c.weighty=1.0;
panel.add(new Button("Button #1"),c);

Schließlich wird eine Komponente unter Verwendung der GridBagConstraints dem Container hinzugefügt. Anschließendändern Sie die GridBagConstraints nach Bedarf, um sie für dienächst Komponente zu verwenden.

Mit dem GridBagLayout lässt sich eine Oberfläche sehr detailiert gestalten. Allerdings kann die Fülle der Möglichkeiten den Programmierer überfordern, sodass man häufig mit verschaltelten Komponenten der anderen Layouts schneller zum Ziel kommt.

Null Layout:

Das Null-Layout ist eigentlich kein Layout-Manager, sondern anstelle des Layout-Managers wird einfach „null“ übergeben. Damit findet praktisch kein Layout-Management mehr statt. Sie müssen dann Komponenten, die hinzugefügt werden, von Hand platzieren und vor allem ihnen eine Größe zuweisen. Wenn Sie die Größe vergessen, haben sie die Größe 0,0 und sind unsichtbar. Das können Sie durch Component#setSize(..); und Component#setLocation(..) oder schneller durch Component#setBounds() erreichen:

Panel panel=new Panel(null); 
Button button=getButton("Button 1"); 
button.setBounds(10,20,100,55); 
panel.add(button);

Der Nachteil des Verfahrens ist, dass bei einer Größenänderung des Fensters die Komponenten nicht neu ausgelegt werden. Daher wird das Null-Layout meist in Komponenten, deren Größe sich nicht ändert (Applets, Meldungsfenster) eingesetzt. Dort kann es dann allerdings auch Sinn machen.

In einer Applikation werden Sie in der Regel mehrere Layoutmanager kombinieren, indem Sie java.awt.Panels oder javax.swing.JPanels verschachteln, die dann wiederum andere Komponenten aufnehmen werden.

« Sammlungsklassen
Java Api
Alle Komponenten »
Show/Hide Footer Actions

Kommentare:

Sie müssen angemeldet sein um eine Nachricht zu erstellen. Anmelden »
© 2012 Java 1. Alle Rechte vorbehalten.
Anmelden
concrete5 - open source CMS
Theme by Site5 / Mnkras.