Microsoft PowerPoint - Graphische Oberfl\344chen_Teil1.ppt

Werbung
Graphische Oberflächen – Teil 1
AWT und Swing
Grundlegender Aufbau von GUIs
Graphikausgabe
Layoutmanagement
Ereignismodell
Menus und Actions
GUI Elemente
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
1
Inhalt
AWT und Swing
•
Unterschied
•
Einbettung von Swing in AWT
Grundlegender Aufbau von Swing GUIs
•
Frames, Windows, Dialogs
•
Panels
Graphikausgabe
•
Positionierung
•
paintComponent und AWT-Thread
•
Graphics und Ausgabeoperationen
Aufbau und Positionierung
•
Component-Hierarchy
•
LayoutManagement
•
Spezielle Anordnungen: JTabbedPane, JSplitPane, JScrollPane, JInternalFrame, 4
Ereignismodell
•
Grundlegendes
•
semantische und systemnahe Ereignisse
•
Patterns für die Ereignisbehandlung
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
2
Inhalt (Fortsetzung)
Menus und Actions
GUI Elemente
•
•
MVC-Paradigma
-
Abstrakte Modelle
-
Ereignisse
Überblick über GUI Elemente
-
JLabel
-
JButton
-
JSpinner
-
JTextField
-
JFormattedTextField
-
4
Dialoge (Teil 2)
•
Modale und Nicht-modale Dialoge
•
Spezielle Dialoge: JFileDialog, JOptionsPane, 4
Spezielle GUI-Elemente (Teil 2)
•
JList
•
JTable
•
JTree
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
3
Graphische Oberflächen
AWT und Swing
Grundlegender Aufbau von GUIs
Graphikausgabe
Layoutmanagement
Ereignismodell
Menus und Actions
GUI Elemente
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
4
AWT und Swing
Abstract Window Toolkit
•
Paket java.awt und Unterpakete
•
Abstrahiert GUI-Komponenten von konkreter Plattform
•
Plattformspezifische Implementierung in "Peer"-Klasse
•
Kleinster gemeinsamer Nenner aller Plattformen
Component
ComponentPeer
Windows
ComponentPeer
Motif
ComponentPeer
MacOS
ComponentPeer
Swing
•
Paket javax.swing und Unterpakete
•
Lightweight-Komponenten
•
Native Container, Rest vollständig in Java implementiert
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
5
Applets
Abgeleitet von java.applet.Applet
•
Browser lädt Klasse und ruft Methoden auf
init
start
paint
stop
destroy
repaint
Ausführung in "Sandbox"
•
Zugriff auf Dateien und Starten von Programmen nicht erlaubt
•
Kommunikation nur mit Server, von dem Applet geladen wurde
import java.awt.*;
public class Demo extends java.applet.Applet {
public void init() {
String text = getParameter("text");
add(new Label(text));
}
}
<applet code="Demo" archive="Demo.jar" width=250 height=70>
<param name="text" value="Hello World!">
</applet>
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
6
Grundlegende Eigenschaften von Swing
Leichtgewichtige Komponenten
•
nur Top-Level-Fenster, Dialoge und grafische Primitivoperationen auf
Systemoperationen abgebildet
•
alles weitere in Java
Pluggable Look-and-Feel
•
Look-and-Feel nicht abhängig vom Betriebssystem
•
unterschiedliche Look-and-Feel verfügbar: Metal, Motif und Windows
•
Umschaltung des Look-and-Feel (auch zur Laufzeit)
Model-View-Controller-Prinzip
•
neue Architektur der GUI-Komponenten nach dem Model-View-ControllerPrinzip
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
7
Pluggable Look and Feel
Bestimmt Aussehen der Swing-Komponenten
Auswahl im Programm
UIManager.setLookAndFeel(
UIManager.getCrossPlatformLookAndFeelClassName()
// oder UIManager.getSystemLookAndFeelClassName()
// oder "javax.swing.plaf.metal.MetalLookAndFeel"
// oder "com.sun.java.swing.plaf.windows.WindowsLookAndFeel"
// oder "com.sun.java.swing.plaf.motif.MotifLookAndFeel"
);
Austausch nach dem Start
UIManager.setLookAndFeel(lnfName);
SwingUtilities.updateComponentTreeUI(frame);
frame.pack();
Spezifikation auf der Kommandozeile
java -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel MyApp
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
8
Applets, AWT und Swing im Vergleich
public class MyFrame extends Frame {
public MyFrame() {
super("AWT Application");
setLayout(new GridLayout(1, 2));
add(new Label("Hello World!"));
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
public class MyApplet extends Applet {
});
public MyApplet() {
setSize(250, 60);
setLayout(new GridLayout(1, 2));
setVisible(true);
add(new Label("Hello World!"));
}
}
}
}
public class MyJFrame extends JFrame {
public MyJFrame() {
super("Swing Application");
getContentPane().setLayout(new java.awt.GridLayout(1, 2));
getContentPane().add(new JLabel("Hello World!"));
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(250, 60);
setVisible(true);
}
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
9
Graphische Oberflächen
AWT und Swing
Grundlegender Aufbau von GUIs
Graphikausgabe
Layoutmanagement
Ereignismodell
Menus und Actions
GUI Elemente
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
10
Komponenten von AWT
Component
Button
Canvas
CheckBox
Choice
ScrollPane
Container
Label
Panel
Window
Frame
List
Scrollbar
TextComponent
TextField
TextArea
Dialog
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
11
Grundlegende Architektur von AWT-GUIs
Frame
MenuBar
Panel
(with Layoutmanager)
Panel
(with layout
manager)
List
Button
•
hierarchische Anordnung
•
es gibt Components und Container
•
Components liegen in Containers
•
Ein Container kann einen Layoutmanager zugeordnet haben, der die
Anordnung (x,y,w,h) der Components bestimmt
•
Bei Components und Containers kann man sich für verschiedene Ereignisse
als Listener anmelden (zB: MouseListener, ActionListener,... )
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
12
Die Basisklasse java.awt.Component
•
Component ist die abstrakte Oberklasse aller
Benutzerschnittstellenkomponenten inkl. der Behälter (Container)
(Außnahmen: Menu, TrayIcon, SplashScreen).
•
Ein Component hat eine graphische Repräsentation und kann mit dem
Benutzer interagieren.
•
Die Oberklasse von Component ist Object.
wichtige Methoden
setBounds(int x, y, w, h)
setLocation(int x, int y)
setSize(int w, int h)
setForeground(Color fg)
setBackground(Color bg)
setFont(Font f)
setEnabled(boolean enabled)
setVisible(boolean)
Container getParent()
Position und Größe der Komponente setzen (Benötigt
z.B. LayoutManager)
Komponente zu neuem Ort bewegen
Neue Größe
Vordergrundfarbe (z.B. für Text)
Hintergrundfarbe
Setzt eine Schriftart, die für Text verwendet werden soll
Legt fest, ob die Komponente mit dem Benutzer
interagieren soll.
Soll die Komponente am Bildschirm sichtbar sein?
Jede Komponente kann den Container in dem sie sich
befindet zurückgeben (oder null)
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
13
Container
Frame
•
Hauptfenster eigenständiger Anwendungen
•
Rahmen und Titelleiste
Dialog
•
Fenster, das zu einem übergeordneten Frame gehört
•
Parameter in Konstruktor bestimmt Modalität
Panel
•
Container für andere Komponenten
•
Verschachtelbar zur Kombination von Layout-Managern
ScrollPane
•
Bildlauf für eine Komponente
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
14
Allgemeines zu Container
•
Container benötigt man, um Benutzerschnittstellenkomponenten anzuordnen.
•
Container sind selbst wieder Benutzerschnittstellenkomponenten und können
daher wieder in anderen Containern enthalten sein (vgl. Datei/Verzeichnis).
•
Benutzerschnittstellenkomponenten werden in solchen Containern
angeordnet.
•
Ihre Koordinaten beziehen sich jeweils auf den Container, in dem sie sich
befinden.
yC2
xC2
yB
xB
Container2
Container1
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
15
Oberklasse java.awt.Container
•
Container ist von Component abgeleitet.
•
Ein Container hat ebenso Größe, Position und kann eine Vielzahl von Ereignissen
erzeugen.
•
Container enthalten Components, die wiederum Container sein können (CompositPattern). Dadurch So wird die die hierarchische Architektur von GUI-Anwendungen
ermöglicht.
wichtige Methoden
add(Component c)
remove(Component c)
removeAll()
int getComponentCount()
Component hinzufügen
Component entfernen
Alle entfernen
Anzahl der Components
setLayout(LayoutManager l)
validate()
validateTree()
LayoutManager setzten (ev: null -> kein LM)
Der Layoutmanager soll alle Components neu layoutieren
wie oben, mit rekursivem Abstieg.
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
16
Einbettung und Swing in AWT
Swing-Komponenten sind in die
Hierarchie der AWT-Komponenten
eingebettet
Component
• JComponent als Basisklasse aller
leichtgewichtigen Komponenten ist
von Container abgeleitet
Container
• JFrame, JDialog, JWindow als
Top-Level-Windows erweitern
Frame, Dialog, Window
Damit werden grundlegende
Mechanismen von AWT geerbt
•
Komponentenhierarchie
•
Ereignismechanismus
JComponent
JPanel
ScrollPane
JWindow
Panel
Window
Frame
Dialog
JFrame
JDialog
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
17
Top-Level-Windows in Swing
JWindow
•
rahmenloses Fenster
•
hat eine ContentPane, um Komponenten aufzunehmen
window.getContentPane().add(component)
JFrame
•
Typisch für Applikationsfenster
•
mit Rahmen, Systemmenü und Standardschaltfläche
JDialog
•
für modale und nicht-modale Dialoge
•
werden mit Parent-Frame erzeugt
•
hat wie JWindow eine ContentPane, um Komponenten aufzunehmen
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
18
JFrame
JFrame ist aus mehreren Panes aufgebaut
• RootPane: Wurzel, beinhaltet Border, Titel,
LayeredPane
JRootPane getRootPane()
Container getContentPane()
JLayeredPane getLayeredPane()
Component getGlassPane()
• LayeredPane: enthält Menüleiste und
ContentPane
• ContentPane: eigentlicher Inhaltsbereich
• GlassPane: vorgelagerte, durchsichtige Pane
für Effekte, die die ganze Frame betreffen
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
19
Aufbau einer JFrame-Applikation
import javax.swing.*;
import java.awt.*;
public class Listing3602
extends JFrame
{
public Listing3602()
{
super("Ein einfacher JFrame");
//WindowListener hinzufügen
addWindowListener(new WindowClosingAdapter(true));
//Layout setzen und Buttons hinzufügen
Container contentPane = getContentPane();
contentPane.setLayout(new GridLayout(3, 1));
contentPane.add(new JButton("Button 1"));
contentPane.add(new JButton("Button 2"));
contentPane.add(new JButton("Button 3"));
}
public static void main(String[] args)
{
Listing3602 wnd = new Listing3602();
wnd.setLocation(100, 100);
wnd.setSize(300, 200);
wnd.setVisible(true);
}
}
public class WindowClosingAdapter
extends WindowAdapter
{
...
public void windowClosing(WindowEvent event)
{
event.getWindow().setVisible(false);
event.getWindow().dispose();
if (exitSystem) {
System.exit(0);
}
}
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
20
Graphische Oberflächen
AWT und Swing
Grundlegender Aufbau von Swing GUIs
Graphikausgabe
Layoutmanagement
Ereignismodell
Menus und Actions
GUI Elemente
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
21
Grafik in Java
•
Zeichenoperationen werden in überschriebenen paint-Methoden
implementiert
•
bei AWT-Komponenten
public void paint(Graphics g)
•
bei Swing-Komponenten
protected void paintComponent(Graphics g)
•
Aufruf der Methoden erfolgt durch eigenen AWT-Thread
•
Anwenderprogramm kann durch Aufruf von
public void repaint()
public void repaint(int x, int y, int width, int height)
das Neuzeichnen der Komponente (eines Bereichs der Komponente)
erzwingen
•
Zwei wesentliche Konzepte zur Grafikdarstellung
•
Koordinatensystem: immer relativ zur Komponente
•
Grafikkontext: stellt virtuelle Zeichenfläche dar
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
22
AWT-Thread
Anwenderprogramm und AWT-Loop laufen in unterschiedlichen Threads
Anwenderprogramm
•
führt Änderungen in den Daten durch, die Änderungen in der GUI bewirken sollen
•
ruft repaint der betroffenen Komponenten auf
AWT ruft bei nächster Gelegenheit paintComponent auf
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
23
Graphik
Graphics
•
Graphikkontext in der Methode paint
•
Zeichnen von Linien, Figuren, Text und Bildern
•
Ursprung links oben
Graphics2D
•
Erweitert Graphics um zusätzliche Zeichenoperationen
•
Verwendung bei Swing-Komponenten
Canvas
public class SSWLogo extends Canvas {
public void paint(Graphics g) {
g.setColor(Color.blue);
g.fillRect(30, 10, 25, 30);
g.setColor(Color.black);
g.fillOval(10, 10, 40, 30);
g.setColor(Color.white);
g.drawString("SSW", 15, 30);
}
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
24
Graphik in Java
Koordinatensystem
• p(0,0) ist links oben.
• p(getWidth()-1, getHeight()-1) ist rechts unten.
• Dies gilt für jede GUI-Komponente (Vorsicht: Hierarchie).
• Die Positionen x, y einer GUI-Komponente beziehen sich auf deren Position im
übergeordneten Container.
0,0
getWidth()-1,
getHeight()-1
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
25
Graphikkontext
•
In der paint(Graphics g)-Methode wird ein Objekt vom Typ java.awt.Graphics
übergeben.
•
Dieses Objekt enthält eine Reihe von Methoden zur Ausgabe von Grafik (z.B.
drawLine()).
•
Zusätzlich hat das Objekt eine Reihe von Zuständen, die die Grafikausgabe
beeinflussen (z.B. aktuelle Zeichenfarbe).
•
Beim Aufruf der Methoden des Grafikkontext-Objekts wird auf ein Ausgabegerät
gezeichnet (meist Bildschirm, aber auch Drucker...)
•
Der Graphikkontext bietet eine Abstraktion vom tatsächlichen Ausgabegerät. Aus
der Sicht des Programmierers macht es keinen Unterschied, ob er auf einen
Drucker, in eine Bild-Datei oder auf den Bildschirm zeichnet.
•
Ein Graphics-Objekt erzeugt man niemals selbst.
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
26
Beispiel Graphikausgabe
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
public class PaintTest extends Frame {
public PaintTest() {
setSize(400, 400);
}
@Override
public void paint(Graphics g) {
for (int x = 0; x <= getWidth() - 1; x = x + 1) {
g.setColor(new Color(0, (int) (255.0 / getWidth() * x),
(int) (255.0 / getWidth() * x)));
g.drawLine(x, 0, getWidth() - x, getHeight() - 1);
}
System.out.println(Thread.currentThread());
}
public static void main(String[] args) {
PaintTest ptc = new PaintTest();
ptc.setVisible(true);
}
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
27
Die Klasse Graphics
• Abstrakte Klasse
• Objekte von Unterklassen werden üblicherweise vom AWT-System in
Abhängigkeit des Ausgabegerätes erzeugt und von uns über die
Typvereinbarung Graphics genutzt.
• Er enthält eine Reihe von Zustandsinformation, die sich auf das Zeichnen
auswirken:
• Color (gegenwärtige Zeichenfarbe)
• Font (gegenwärtige Schriftart für Text)
• ein sog. Clip (Zeichenoperationen wirken sich nur innerhalb des Clip
aus)
• gegenwärtige logische Pixeloperation (XOR oder Paint)
• Die Komponente, auf der gezeichnet werden soll.
• So hängt z.B. die Operation drawLine(x1,y1,x2,y2) von XOR-Mode,
Color und Clip ab.
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
28
Zeichenoperationen der Klasse Graphics
clearRect(int x,int y,int w, int h)
copyArea(x,y, w,h, dx, dy)
draw3DRect(x,y,w,h, boolean raised)
drawArc(x,y,w,h, int startAngle, int arcAngle)
drawLine(x1,y1,x2,y2)
drawOval(x,y,w,h)
drawPolygon(x[], y[], int nPoints)
drawPolyLine(x[], y[], int nPoints)
drawRect(x,y,w,h)
drawRoundRect(x,y,w,h, int arcWidth, int arcHeight)
drawString(String str, x,y)
fill3DRect(x,y,w,h, boolean raised)
fillArc(...)
fillOval(...)
fillPolygon(...)
fillRoundRect(...)
...
drawImage(Image img, x,y, ImageObserver obs)
drawImage(...)
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
29
Weitere Methoden der Klasse Graphics
translate(int x, int y)
// Verschieben des Koordinatenursprungs
setPaintMode()
// normalen Zeichenmodus setzen (default)
setXORMode(Color c1)
// XOR-Modus momentane Farbe xor c1
setFont(Font f)
// Schriftart setzen
setColor(Color c)
// Zeichenfarbe setzten
setClip(x,y,w,h)
// setzt neues Clip (Pixel nur innerhalb
// betroffen)
getFontMetrics():FontMetrics
// holt Metrik-Informationen zur Font
// z.B. Wie viele Pixel breit/hoch ist "1.
// Object"
getFont():Font
// aktuelle Schriftart
getColor():Color
getClipBounds():Rectangle
// Rechteckigen Clip-Bereich holen;
...
// Auch wenn eine Linie über diesen
// hinausgeht, wird nur innerhalb gezeichnet.
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
30
Font und Fontmetrics
Die Klasse Font
Repräsentiert eine Schriftart:
Konstruktion mit:
Font f = new Font("Monospaced", Font.BOLD, 14)
3 Standard Namen: "MonoSpaced", "Serif", "SansSerif",
Einige Methoden:
Font (String name, int style, int size)
int getSize()
// Schriftgröße in Pixel
boolean isBold()
// fett
boolean isItalic()
// kursiv
static final int PLAIN
// Konstanten für Schriftstil
static final int BOLD
static final int ITALIC
... uvm.
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
31
Font und Fontmetrics
Die Klasse Fontmetrics
Stellt typographische Informationen über einzelne Zeichen und Strings in
konkreten Schriftarten zur Verfügung.
Erreicht man am besten über Grafikkontext:
FontMetrics fm = g.getFontMetrics(); oder
fm = g.getFontMetrics(aFont);
nützliche Methoden:
int
int
int
int
int
int
charWidth(char ch)
stringWidth(String s)
getAscent() // Oberlänge
getDescent() // Unterlänge
getHeight() // Höhe
getLeading() // Zeilenabstand
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
32
Graphische Oberflächen
AWT und Swing
Grundlegender Aufbau von Swing GUIs
Graphikausgabe
Layoutmanagement
Ereignismodell
Menus und Actions
GUI Elemente
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
33
Layoutmanager
Anordnung von Komponenten
•
Fenstergröße und Schrift können sich ändern
•
Layout wird logisch beschrieben und nicht mit absoluten Koordinaten
•
Constraints beeinflussen Positionierung
FlowLayout
Yes
GridLayout
No
Cancel
BorderLayout
1
2
3
4
5
6
GridBagLayout
North
Button1
Button2
Button3
Button4
Button5
West
Center
East
Button6
Button8
South
Button7
Button9
Button10
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
34
Grundprinzip
•
LayoutManager setzen
•
Größe der Komponenten bestimmen
•
Komponenten anfügen
•
LayoutManager bestimmt damit automatisch Positionierung und tatsächliche Größe
aContainer.setLayout(new XXXLayout());
component1.setPreferredSize(new Dimension(100, 30));
component1.setMinimumSize(new Dimension(60, 20));
component1.setMaximumSize(new Dimension(160, 40));
...
aContainer.add(component1);
aContainer.add(component2);
aContainer.add(otherContainer);
//Layoutmanager bestimmt Positionen der Components im Container
•
Swing-Komponenten haben 3 Größeneigenschaften, die von Layoutmanagern
verwendet werden
•
preferredSize: bevorzugte Größe für Komponente
•
minimumSize: minimale Größe für Komponente
•
maximumSize: maximale Größe für Komponente
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
35
Layout Management Klassen
•FlowLayout
Ordnet die Komponenten wie Wörter auf einer Seite an. (Zentriert,
rechts- oder linksbündig)
•BorderLayout
Unterstützt genau 5 Komponenten. Eine an jeder Seite und eine im
Zentrum
•GridLayout
Teilt den Container in Zeilen und Spalten. Alle Zellen sind gleich
groß.
•GridBagLayout
Sehr flexibel und kompliziert. Für jede Komponente können
Einschränkungen definiert werden
•CardLayout
Zeigt jeweils nur eine Komponente, die den Container ausfüllt.
Die anderen liegen quasi unsichtbar dahinter und man blättert bei
Bedarf weiter (z.B. Tabs)
•BoxLayout
Ordnet Komponenten von rechts nach links, oben nach unten oder
in Schreibrichtung an
•GroupLayout und SpringLayout
Mächtig, komplex und speziell für GUI-Builder entwickelt
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
36
FlowLayout
f = new FlowLayout();
f.setAlignment(FlowLayout.CENTER, 20, 20) // Zentriert; horizontaler
// und vertikaler Abstand = 20
container.setLayout(f);
container.add(component1);
container.add(component2);
container.add(containerX);
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
37
BorderLayout
container.setLayout(new BorderLayout());
container.add(component1, BorderLayout.NORTH);
container.add(component2, BorderLayout.CENTER);
container.add(containerX, BorderLayout.WEST);
...
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
38
GridLayout
g = new GridLayout(rows, cols);
container.setLayout(g);
container.add(component1);
//Zeilen und Spalten
// Auffüllen von links oben zeilenweise
// nach rechts unten
container.add(component2);
container.add(containerX);
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
39
BoxLayout
public class BoxLayoutTest extends JFrame {
public BoxLayoutTest() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setTitle("Box Layout Test");
setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
...
btn = new JButton("Left aligned (long button)");
btn.setAlignmentX(Component.LEFT_ALIGNMENT);
add(btn);
btn = new JButton("Right aligned");
btn.setAlignmentX(Component.RIGHT_ALIGNMENT);
add(btn);
...
}
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
40
Weitere
GridbagLayout
CardLayout
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
41
null-Layout
•
Beim Arbeiten ohne LayoutManager muss man selbst für die Anordnung
der Komponenten sorgen.
•
Bei Größenänderungen erfolgt keine automatische Anpassung, wie bei
Verwendung von Layout-Managern. Dennoch wird dies häufig
verwendet.
Beispiel
container.setLayout(null); // explizit nötig, um default-layout zu umgehen
component1.setBounds(10,10,100,100); // x, y, Breite, Höhe
component2.setBounds(10,150,100,100); // x, y, Breite, Höhe
container.add(component1);
container.add(component2);
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
42
Zusammenfassung
Applets
•
Kleine Programme innerhalb von Webseiten
•
Eingeschränkte Berechtigungen
Anwendungen
•
Hauptfenster und Dialogfenster
•
Pluggable Look and Feel unter Swing
Layout-Manager
•
Kontrollieren Position und Größe der Komponenten
JOHANNES KEPLER UNIVERSITY LINZ
Research and teaching network
Pratikum SWE 2
© M. Löberbauer, T. Kotzmann, H. Prähofer
43
Herunterladen