7 GUI: Graphical User Interface 7 AWT, Swing, SWT, 7

Werbung
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
Herunterladen