Prog. 2 Prog. 2 7 GUI: Graphical User Interface • Zweck eines Graphical User Interfaces (Grafische Benutzerschnittstelle) 7 AWT, Swing, SWT, ... • Wichtige an Java angebundene GUI-Toolkits – Abstract Window Toolkit (AWT) Kommunikation zwischen Benutzer und Programm • Allgemeine Abstraktion von GUI-Tools (Mit Systemfunktionen implementiert) • Fenster & Knöpfe haben „Look and Feel“ des Systems auf dem das AWT läuft – Eingaben des Benutzers entgegennehmen • Byte-Code von AWT-Programmen kleiner als von Swing-Programmen – Eingaben auswerten – Swing – Ergebnisse berechnen • Komplett in Java unabhängig vom Betriebssystem implementiert – Ergebnisse anzeigen • Byte-Code von Swing-Programmen umfangreicher als von AWT-Programmen • Benutzer produziert Ereignisse, auf die ein Java-Programm reagiert • Unterschiedliche Steuerflächen zur Handhabung von Ereignissen • Zur Verfügung stehende Look-and-Feels – Windows: – Mac OS X: – Steuerflächen werden mit Hilfe vordefinierter Klassen erzeugt • Metal, Motif, Windows, WindowsXP – Linux, BSD: Metal, Motif, GTK Metal, Aqua – Standard Widget Toolkit (SWT) Schnittstellen (Klassen) legen Methoden zur Ereignisbehandlung fest • Von IBM (für das Eclipse Projekt) entwickelt – Klasse mit Schnittstelle muss alle Methoden der Schnittstelle beinhalten (Methodenimplementierung erforderlich) • Vereint die Vorteile von AWT und Swing • www.eclipse.org/swt/ 26.05.2009 Prog. 2 7 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 1 Prog. 2 Klassenstruktur des AWT Component Container Button Window Panel Frame 7 MenuComponent Checkbox ScrollPane ... ... Menubar • MenueItem CheckboxMenuItem Komponenten, Fenster und Menüs Dialog 26.05.2009 • Menu • PopupMenu Image Graphics Rectangle ... Ereignisbehandler (Interface für Klassen, die Container setzen) (Listener, Adapter) LayoutManager DebugGraphics Font WindowListener Graphics2D Color ... FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke ... MouseListener MouseEvent 26.05.2009 GUIs werden in Fenstern dargestellt import java.awt.*; public class HelloAWT extends Frame { public HelloAWT() { In der Praxis verwendet man hierzu die Klasse Frame setTitle("Hello AWT"); // Optional setSize(400,400); setVisible(true); Eine Anwendung kann mehrere Fenster haben } public static void main(String[] args){ – Für jedes Fenster deklariert man eine Klasse, die Frame erbt LayoutManager ... 3 2 Fenster darstellen (Window, Frame) – Unnterklasse von Window FileDialog Grafik, Bildmanipulation FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke • Hat ein Programm nur ein Fenster, deklariert die Klasse des Hauptprogramms auch das Fenster • In Frame und Component deklarierte Methoden – setTitle() – setSize() – setVisible() 26.05.2009 new HelloAWT(); } } FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 4 Prog. 2 7 • Prog. 2 Fenster schließen Mit Frame erzeugte Fenster werden geschlossen mit /* Öffnet ein Fenster und schließt es 7 Fenster-Eigenschaften • Die Größe und Position eines Fensters können nach 2 Sekunden wieder */ – gesetzt werden mit • void setSize(int width, int heigt) import java.awt.*; – Setzt die Fenstergröße auf Breite x Höhe = widht x height – setVisible(false) • Macht das Fenster unsichtbar public class CloseWindow { • void setLocation(int x, int y) public static void main(String[] args) { • Es kann wieder sichtbar gemacht werden – Setzt die Fensterposition auf (x,y) Frame frame = new Frame( "Close Window after 2 sec"); • Es ist noch vorhanden (in der Owner-Child Registrierung) und belegt Ressourcen • void setBounds(int x, int y, int width, int height) – Setzt Fenster der Größe width x height an die Position (x,y) frame.setSize(400,400); – abgefragt werden mit frame.setVisible(true); • Dimension getSize() try{ • Point getLocation() Thread.sleep(2000); – dispose() • Rectangle getBounds() } catch(InterruptedException e) { • Gibt die zugeordneter Ressourcen frei } • Entfernt Fenster aus der OwnerChild Registrierung frame.dispose(); • frame.setVisible(false); // Obsolet – umgeschaltet werden: synchronized void setState(int state) System.exit(0); • Ruft implizit setVisible(false) auf Der Anzeigezustand („normal“=NORMAL, „als Symbol“=ICONIFIED) eines Fenster kann – abgefragt werden: } synchronized int getState() } 26.05.2009 Prog. 2 7 • FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 5 26.05.2009 Prog. 2 Fenster-Eigenschaften (Beispiel) 7 • Öffnen zweier Fenster und Wechseln zwischen normaler und SymbolDarstellung FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke Der Mauszeiger Es können verschiedene Mauszeiger vorgeben werden: void setCursor(Cursor cursor) import java.awt.*; • while (true) { public class WindowState { try { Thread.sleep(1000); public static void main(String[] args) { } catch (InterruptedException e) { Frame frame1 = new Frame("First Window"); } Frame frame2 = new Frame("Second Window"); frame1.setState(Frame.ICONIFIED); Frame frame = new Frame(“Set Cursor"); frame.setBounds(500, 100, 400, 400); frame.setVisible(true); frame.setCursor( new Cursor(Cursor.CROSSHAIR_CURSOR)); – Cursor.TEXT_CURSOR } – Cursor.WAIT_CURSOR frame1.setState(Frame.NORMAL); frame2.setBackground(Color.blue); frame2.setState(Frame.ICONIFIED); } – Cursor.E_RESIZE_CURSOR – Cursor.N_RESIZE_CURSOR } – Cursor.S_RESIZE_CURSOR } FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke } – Cursor.MOVE_CURSOR } 26.05.2009 public static void main(String[] args) { Es gibt vordefinierte Cursor-Typen } catch (InterruptedException e) { frame2.setBounds(500, 100, 400, 400); frame2.setVisible(true); public class MouseType { – Cursor.HAND_CURSOR Thread.sleep(1000); frame1.setVisible(true); import java.awt.*; Der Konstruktor der Klasse Cursor erwartet eine ganzzahlige Konstante, die den Cursor-Typ definiert – Cursor.DEFAULT_CURSOR try { frame1.setBackground(Color.yellow); // Setzen des Mauszeigers – Cursor.CROSSHAIR_CURSOR frame2.setState(Frame.NORMAL); frame1.setBounds(100, 100, 400, 400); • 6 – ... 7 26.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 8 Prog. 2 7 • Grafik/Text ausgeben Ausgaben von Grafik oder Text in Fenster durch überschreiben der Methode paint in – Der Klasse, die Frame erweitert – Einem Objekt einer Klasse, die Canvas erweitert und die zur von Frame abgeleiteten Klasse hinzugefügt wurde • Das Laufzeitsystem – versorgt sie mit einem Graphics-Objekt als Parameter 7 • • Fensters durch Anwender schließen Um Fenster vom Anwender schliessbar zu machen, muß ein WindowListener registriert werden – Geschieht mit der Methode void addWindowListener( WindowListener l) • Hierzu (nur) die benötigten Methoden der Klasse public abstract WindowAdapter extends Object implements WindowListener public static void main(String[] args) { new GaTwAWT(); } windowActivated(WindowEvent e) – windowClosed(WindowEvent e) – windowClosing(WindowEvent e) – Fenster wird neu aufgebaut – windowOpenend(WindowEvent e) – repaint() wird (von aussen) aufgerufen – windowIconified(WindowEvent e) – .. } Zeichnung immer dann wenn FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke import java.awt.*; import java.awt.event.*; public class Moire extends Frame { public Moire() { setForeground(Color.blue); setTitle("Moire Muster"); setSize(400, 400); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); setVisible(true); } public void paint(Graphics g) { for (int r = 0; r <= 400; r += 5) { g.drawOval(200 - r/2, 200 - r/2, r, r); g.drawLine(0, r, 400, r); } } überschreiben – 26.05.2009 Prog. 2 7 import java.awt.*; public class GaTwAWT extends Frame { int x[] ={150, 250, 250, 150, 150, 250, 200, 150, 250}; int y[] ={300, 200, 300, 300, 200, 200, 120, 200, 300}; public GaTwAWT() { setTitle("Grafik und Text"); setSize(400, 400); setVisible(true); } public void paint(Graphics g) { g.drawString("Das Haus vom Nikolaus!", 100 ,40 ); g.drawPolyline(x,y,9); } – ruft die Methode paint auf • Prog. 2 9 Das Interface WindowListener 7 Eine Klasse, die Fenster-Events bearbeiten will, implementiert das Interface WindowListener und implementiert alle Methoden: • – void windowActivated(WindowEvent e) } 26.05.2009 Prog. 2 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 10 Randelemente eines Fensters Es wird nicht in das gesamte Fenster gezeichnet, sondern nur in die Client-Area • Aufruf, wenn das Fenster aktiv wird – void windowClosed(WindowEvent e) public static void main(String[] args) { new Moire(); } (0,0) • Aufruf, wenn das Fenster aus dem Programm heraus geschlossen wird getInsets().top – void windowClosing(WindowEvent e) • Aufruf, wenn das Fenster vom Benutzer geschlossen wird public int int int int int int int int int for – void windowDeactivated(WindowEvent e) • Aufruf, wenn das Fenster nicht mehr das aktive Fenster ist Client-Area – void windowDeiconified(WindowEvent e) void paint(Graphics g) { width = getSize().width; height = getSize().height; left = getInsets().left; right = getInsets().right; top = getInsets().top; bottom = getInsets().bottom; mx = (width-left-right)/2; my = (height-top-bottom)/2; dm = mx < my ? mx : my; (int d = 0; d <= 2*dm; d += 5) { g.drawOval(left+mx-d/2, top+my-d/2, d, d); g.drawLine(left, top+d, width-right, top+d); } • Aufruf, wenn das Fenster von minimaler auf normale Größe gebracht wird } – void windowIconified(WindowEvent e) • Aufruf, wenn das Fenster minimiert wird – void windowOpened(WindowEvent e) getInsets().bottom • Aufruf, wenn das Fenster zum ersten Mal sichtbar wird oder erweitert die abstrakte Klasse WindowAdapter und implemeniert nur die benötigten Methoden von WindowListener 26.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke getInsets().left 11 26.05.2009 getInsets().right FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 12 Prog. 2 7 • Prog. 2 Zeichenfläche (Canvas) Die Klasse java.awt.Canvas stellt rechteckige Zeichenflächen zur Verfügung – Instanzen von Canvas werden meist als Zeichenflächen in eine AWTOberfläche eingefügt um darauf zu zeichnen – Instanzen von Klassen, die von Canvas abgeleitet werden, können als AWT-Komponenten eingesetzt werden 7 import java.awt.*; import java.awt.event.*; public class SimpleCanvas extends Frame { static Button b; static Canvas c; public static void main(String[] args) { Frame f = new Frame(); f.setTitle("Simple Canvas Example"); f.setSize(400, 400); b = new Button("Press"); c = new Canvas(); c.setBounds(0,0,f.getWidth(),f.getHeight()/2) ; c.setBackground(Color.darkGray); f.setLayout(new FlowLayout(FlowLayout.CENTER,10,10)); f.add(c); f.add(b); f.add(new Label("to draw circle")); b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e){ Graphics g = c.getGraphics(); g.setColor(Color.YELLOW); g.fillOval(150, 150, 100, 100); }}); f.setVisible(true); 26.05.2009 Prog. 2 7 • } FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke } 13 import java.awt.*; class MoireCanvas extends Canvas { import java.awt.event.*; public static final byte H_LINES = 0; public class CanvasExample extends Frame { public static final byte V_LINES = 1; public CanvasExample() { protected byte moireType; MoireCanvas moire; String description; moire = new MoireCanvas("Horizontal lines", int moNr; MoireCanvas.H_LINES, 0); MoireCanvas(String s, byte t, int n) { makeMoire(moire); description = s; moire = new MoireCanvas("Vertical lines", moireType = t; MoireCanvas.V_LINES, 1); moNr = n; makeMoire(moire); } } public void paint(Graphics g) { public static void makeMoire(MoireCanvas canvas){ for (int r = 0; r <= 400; r += 5) { Frame f = new Frame(); g.drawOval(200 - r/2, 200 - r/2, r, r); f.add(canvas); if(moireType == H_LINES) f.setTitle(canvas.description); g.drawLine(0, r, 400, r); f.setSize(400, 400); else if(moireType == V_LINES) f.setLocation(100*canvas.moNr, 100*canvas.moNr); g.drawLine(r, 0, r, 400); f.setVisible(true); } f.addWindowListener(new WindowAdapter() { } public void windowClosing(WindowEvent e) { } System.exit(0);}}); } public static void main(String[] args) { new CanvasExample(); } } 26.05.2009 Prog. 2 GUI-Dialoge 7 • Hauptbestandteil der GUI sind, neben den Grafikbereichen, in Fenster eingebettet Dialogelemente Zeichenflächen (Beispiel) • Fenster, deren Ausgabe nicht mit primitiven Grafikoperationen, sondern (allein) mit Dialogelementen erzeugt wurden nennt man kurz Dialoge • AWT kennt keinen Unterschied zwischen Fenstern zur Ausgabe von Dialogen und Fenstern zur Ausgabe von Grafiken – – 2. Zurordnen eines Layoutmanagers Fenster zur Aufnahme von Dialogelementen werden genauso erzeugt wie Fenster zur Grafikdarstellung Ein Dialog-Fenster kann abgeleitet werden von Die Erstellung eines Dialogs erfolgt in vier Schritten 1. Anlegen eines (Dialog-)Fensters 3. Einfügen von Dialogelementen Frame • Universelles Fenster • Kann Menuleiste haben • Dem Fenster kann ein Icon zugeordnet werden Dialog • Erlaubt es das Ändern der Fenstergröße durch den Benutzer zu verhindern • Bietet die Möglichkeit den Dialog modal zu machen 4. Anzeigen des Fensters 26.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke – 15 14 Anlegen eines Dialog-Fensters – • FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 26.05.2009 Interaktion des Anwenders mit anderen Fenstern der Anwendung wird bis zum Schließen des Dialogs verhindert • Es kann keine Menuleiste erzeugt werden • Dem Fenster kann kein Icon zugeordnet werden FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 16 Prog. 2 7 • • • Prog. 2 Zuordnen eines Layoutmanagers 7 AWT realisiert die Anordnung von GUI-Elementen in Fenstern • Einfügen von Dialogelementen – über Layoutmanager (plattformunabhängiges Erscheinungsbild) Das Einfügen von Dialogelementen in ein Fenster erfolgt mit der folgenden Methode der Klasse Container – nicht durch Angabe absoluter Koordinaten – public Component add(Component comp) – public Component add(Component comp, int pos) Um einen Layoutmanager zu verwenden, muss dieser dem Fenster mittels setLayout (Methode von Container) zugeordnet werden • Unterschiedliches Vorgehen um Komponenten optimal anzuordnen • 1. FlowLayout • • Elemente nebeneinander in einer Zeile angeordnet (Zeile voll dann Nächste) • • Elemente werden in einem rechteckigen (Zeile-, Spalten-)Gitter angeordnet 3. BorderLayout • • – public int getComponentCount() – public Component getComponent(int n) – public Component[] getComponents() • • Es können mehrere Unterdialoge verwaltet werden 5. GridBagLayout – Fenster wird in rechteckige Bereiche (unterschiedlicher Größe) unterteilt 26.05.2009 Prog. 2 7 • FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke • 17 Liefert ein Array mit alle eingefügten Komponenten FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke FlowLayout import java.awt.*; • Einfachster Layoutmanager public class SimpleDialog extends Frame { • Konstruktoren: public static void main(String[] args) { public static void main(String[] args){ FlowLOExample window = new FlowLOExample(); window.setVisible(true); } – public FlowLayout() align gibt die Anordnung der Elemente in einer Zeile an. Kann sein new SimpleDialog(); • FlowLayout.CENTER; } public FlowLOExample() { super("FlowLayout Test"); setLayout(new FlowLayout(FlowLayout.RIGHT,10,10)); add(new Button("Button 1")); add(new Button("Button 2")); add(new Button("Button 3")); add(new Button("Button 4")); pack(); } • FlowLayout.LEFT; • FlowLayout.RIGHT; public SimpleDialog() { – public FlowLayout(int align, int hgap, int vgap) setLayout(new FlowLayout()); add(new Button("To be")); • hgap add(new Button("Not to be")); public void pack() horizontaler Abstand zwischen zwei Komponenten (default = 5) pack(); aufgerufen werden 18 import java.awt.*; public class FlowLOExample extends Frame{ – public FlowLayout(int align) SimpleDialog window = Um die Größe des Fensters an den zur Darstellung der Dialogelemente erforderlichen Platz anzupassen kann vor dem Anzeigen des Dialogs } • vgap } 26.05.2009 Liefert die Komponente mit Index n 7 window.setVisible(true); • Liefert die Anzahl aller eingefügten Komponenten 26.05.2009 Prog. 2 Anzeigen des Dialogfensters Sind alle Komponenten an den Container übergeben worden, kann der Dialog formatiert und mittels setVisible angezeigt werden public void remove(Component comp) Auf bereits eingefügte Dialogelemente kann zugegriffen werden Elemente werden auf vier Randbereiche und die Fenstermitte verteilt 4. CardLayout Layoutmanager fügt das Element comp an der Stelle pos der Elementliste ein Komponenten können auch wieder gelöscht werden – 2. GridLayout Layoutmanager fügt das Element comp im Fenster ein FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke vertikaler Abstand zwischen zwei Komponenten (default = 5) 19 26.05.2009 } FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 20 Prog. 2 7 GridLayout • Anordnung der Elemente in einem rechteckigen Gitter Konstruktoren: • Prog. 2 import java.awt.*; public class GridLOExample extends Frame{ public static void main(String[] args){ GridLOExample window = new GridLOExample(); window.setVisible(true); } – public GridLayout(int rows, int columns) • rows Vertikale Elementanzahl • Colums public GridLOExample() { super("GridLayout Test"); setLayout(new GridLayout(2,3)); add(new Button("Button 1")); add(new Button("Button 2")); add(new Button("Button 3")); add(new Button("Button 4")); add(new Button("Button 5")); pack(); } Horizontale Elementanzahl – public GridLayout(int rows, int columns, int hgap, int vgap) • hgap horizontaler Abstand zwischen zwei Komponenten (default = 5) • vgap vertikaler Abstand zwischen zwei Komponenten (default = 5) 7 BorderLayout • Bildschirm wird in fünf Bereiche aufgeteilt • Angabe einer Himmelsrichtung Aufruf von add(Component comp, Object constraints) – Vier Ränder und Zentrum • – NORTH – SOUTH – WEST – EAST – CENTER import java.awt.*; public class BorderLOExample extends Frame { public static void main(String[] args) { BorderLOExample window = new BorderLOExample(); beim window.setVisible(true); } public BorderLOExample(){ super("BorderLayout Test"); setSize(400,200); setLayout(new BorderLayout()); add(new Button("Button 1"),BorderLayout.NORTH); add(new Button("Button 2"),BorderLayout.SOUTH); add(new Button("Button 3"),BorderLayout.WEST); add(new Button("Button 4"),BorderLayout.EAST); add(new Button("Button 5"),BorderLayout.CENTER); } Konstruktoren: – public BorderLayout() – public GridLayout(int hgap, } int vgap) • hgap } horizontaler Abstand • vgap vertikaler Abstand 26.05.2009 Prog. 2 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 7 CardLayout • Komponenten werden übereinander angeordnet – Nur oberstes Element ist sichtbar – Jeweils nächstes bzw. vorhergehendes Element kann sichtbar gemacht werden – Mittels show() kann ein Element direkt angesprungen werden • 26.05.2009 Prog. 2 7 import java.awt.*; import java.awt.event.*; public class CardLOExample extends Frame{ Panel card; • Zusätzliche Möglichkeiten window.setVisible(true); } public CardLOExample() { – Komponenten können sich über mehrere Zellen erstrecken – Spalten und Zeilen können unterschiedlich breit bzw. hoch sein – Komponenten können super("CardLayout Test"); setLayout(new BorderLayout()); – public CardLayout() – public CardLayout(int hgap, Button b = new Button("Next card"); add("North",b); – card.add("Button 1", new Button("Button 1")); Methoden card.add("Label", new Label("Label")); – void next(Container parent) card.add("Button 2", new Button("Button 2")); – void previous(Container par) add("Center",card); – void last(Container parent) – ... • ihre Zellen komplett ausfüllen • normale Größe haben – card = new Panel(); card.setLayout(new CardLayout()); pack(); • b.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ((CardLayout)card.getLayout()).next(card); } }); 22 GridBagLayout „Flexible Variante“ von GridLayout (basiert auf einem Gitter) CardLOExample window = new CardLOExample(); Konstruktoren FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke • public static void main(String[] args) { int vgap) • 21 Innerhalb einer Zelle angeordnet werden Anteil der Höhen- bzw. Breitenveränderung eines Containers kann variabel an Gitterzellen verteilt werden Einstellung der Eigenschaften erfolgt mittels GridBagConstraints – Belegung entsprechender Attribute eines GridBagConstraints-Objektes – Die Klasse GridBagConstraints bringt viele Konstanten mit } } 26.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 23 26.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 24 Prog. 2 7 • GridBagConstraints (I) GridBagConstraints.width – Absolute Werte oder Steuerung über die Konstanten • • • Ordnet Komponente direkt unter/neben der Vorhergehenden in nächster Zeile/Spalte an Default GridBagConstraints.RELATIVE Konstanten Anordnung neben/unter zuvor eingefügte Komponente – GridBagConstraints.anchor – Konstanten GridBagConstraints.NONE, HORIZONTAL, VERTICAL, BOTH – GridBagConstraints.weightx – Gewichtete Verteilung des vorhandenen Platzes auf die einzelnen Gitterzellen • – – 7 2. Für jedes einzufügende Dialogelement muss ein (Eigenschafts-)Objekt des Typs GridBagConstraints angelegt werden Über die Membervariablen von GridBagConstraints werden die Layouteigenschaften es Dialogelements festgelegt Zusätzlicher Raum an den Rändern des Anzeigenbereichs der Komponente GridBagConstraints.ipadx / GridBagConstraints.ipady Beeinflußt Mindestplatzbedarf einer Komponente FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 26 GridBagLayout (Beispiel) import java.awt.*; Vorgehensweise bei der Verwendung von GridBagLayout 1. Instanzieren eines Objekts vom Typ GirdBagLayout und zuweisen zu einem Fenster mittels setLayout 1.0 Komponente erhält den gesamten zusätzlichen Raum 26.05.2009 Prog. 2 GridBagLayout (Verwendung) 0.0 Komponente erhält bei Containerverbreiterung keinen zusätzlichen Platz – GridBagConstraints.insets • GridBagConstraints.CENTER, NORTH, NORTHWEST, ... 25 – Zusätzliche Abstände • FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke / GridBagConstraints.weighty Werte aus [0.0, 1.0] / GridBagConstraints.gridy Festlegung der Position innerhalb eines Anzeigenbereichs public class GridBagExample extends Frame { TextField textField = new TextField(); public static void main(String[] args) { gridC.gridx = 2; GridBagExample window = new GridBagExample(); GridBagLayout gbl = new GridBagLayout(); setLayout(gbl); gridC.ipadx = 100; window.setVisible(true); gridB.setConstraints(textField, gridC); } add(textField); public GridBagExample() { super("GridBagLayout Test"); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.width = 1; gbc.height = 1; gbc.ipax = 100; gbc.fill = GridBagConstraints.BOTH; Button lButton = new Button("Long Button"); GridBagLayout gridB = new GridBagLayout(); setLayout(gridB); gridC.gridx = 1; GridBagConstraints gridC = new GridBagConstraints(); gridC.gridy = 1; gridC.gridwidth = 2; Button hButton = new Button("High Button"); gridC.ipadx = 0; gridC.gridx = 0; gridC.fill = GridBagConstraints.HORIZONTAL; gridC.gridy = 0; gridC.gridwidth = 1; gridB.setConstraints(lButton, gridC); gridC.gridheight = 2; add(lButton); gridC.fill = GridBagConstraints.VERTICAL; pack(); gridB.setConstraints(hButton, gridC); add(hButton); 3. Dialogelement und Eigenschaftsobjekt mit setConstraints an Layoutmanager übergegeben Button b = new Button(“But“); gbl.setConstraints(b,gbc); 4. Dialogelement mittels add an Fenster übergeben add(b); 26.05.2009 – • – • GridBagConstraints.fill Aufteilung des Platzes GridBagConstraints.RELATIVE GridBagConstraints.gridx 26.05.2009 – • Vergibt den Rest der aktuellen Zeile/Spalte an die Komponente – • 7 Festlegung ob/wie eine Komponente ihren Anzeigenbereich ausfüllt / GridBagConstraints.height Festlegung der Position • GridBagConstraints (II) GridBagConstraints.REMAINDER – Prog. 2 • – – • 7 Breite und Höhe des Anzeigenbereichs • • Prog. 2 } } Choice choice = new Choice(); choice.add("1. Choice"); choice.add("2. Choice"); gridC.gridx = 1; gridC.gridheight = 1; FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke gridB.setConstraints(choice, gridC); add(choice); 27 26.05.2009 FH-Wiesbaden --- Medieninformatik --- SS 2009 --- Prof. Dr. Ulrich Schwanecke 28