Grafikprogrammierung mit swing

Transcrição

Grafikprogrammierung mit swing
Frühjahrsemester 2013
CS108 Programmier-Projekt
Kapitel 7: Grafikprogrammierung mit swing
H. Schuldt
7.1 Übersicht – Geschichte von swing
•
AWT hat den meisten Ansprüchen für die Grafikprogrammierung nicht genügt
•
Abhilfe wurde durch die Java Foundation Classes (JFC) geschaffen
– JFC beinhalten Erweiterungen für die Erstellung grafischer
Benutzerschnittstellen
•
JFC-Erweiterungen:
– Swing GUI-Komponenten: sind vollständig in Java implementiert und daher
nicht mehr plattformabhängig (basieren aber zum Teil wiederum auf AWT)
– Pluggable look and feel: Möglichkeit, das Aussehen von Komponenten zur
Laufzeit zu verändern
– Accessibility: Unterstützung für Menschen mit Behinderungen
(z.B. Lesegeräte für Blinde, Lupe für den Bildschirm, oder auch
Spracherkennung)
– Java 2D-API: Unterstützung der Objektbeschreibung und -darstellung
– Unterstützung von Drag & Drop: Kopie von Daten über Anwendungsgrenzen
hinweg
– Internationalisierung
– Unterstützung der Model-View-Controler (MVC)-Architektur
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-2
1
Model – View – Controller (MVC)
•
•
Model-View-Controller ist ein Software-Architekturmuster, das die
Anwendungslogik von der grafischen Benutzerschnittstelle separiert
Bestandteile:
– Model (Modell): anwendungsabhängige Repräsentation der Daten (auf denen
die Anwendungslogik angewandt wird). Bei Änderung der Daten werden die
zugehörigen Views benachrichtigt.
– View (Präsentation): Benutzerschnittstelle (Graphische Repräsentation).
Zu einem Modell kann es mehrere unterschiedliche Views geben.
– Controller (Steuerung): verwaltet alle Präsentationen zu einem Modell.
Nimmt Input auf und stösst die Reaktion auf Benutzerinteraktionen an.
Controller
View
FS 2013
Model
Programmier-Projekt (cs108) – Grafikprogrammierung
7-3
Swing: Übersicht
•
Zusätzlich zu den AWT-Komponenten gibt es in swing eine Menge an neuen
Komponenten
– Swing-Komponenten sind alle Subklassen der Klasse JComponent
•
Swing API-Pakete
javax.swing
javax.accessibility
javax.swing.border
javax.swing.text
…
•
Verwendung von Swing: Import von (in den meisten Fällen)
import javax.swing.*
import javax.swing.event.*
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-4
2
Swing-Beispiele …
Beispiel 1: Hello World
import javax.swing.*;
import javax.swing.event.*;
public class HelloWorldSwing {
private static void createAndShowGUI() {
// Make sure we have nice window decorations
JFrame.setDefaultLookAndFeelDecorated(true);
// Create and set up the window.
JFrame frame = new JFrame("HelloWorldSwing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Add the ubiquitous "Hello World" label
JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
// Display the window
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI
javax.swing.SwingUtilities.invokeLater(new Runnable(){
public void run() {
createAndShowGUI();
}
});
}
Grundlegende Aufgaben
1. Importiere Pakete
2. Top-Level Container
aufsetzen
3. Anzeige des
Containers
4. Komponenten
hinzufügen
5. Auf Concurrency
achten
(„be thread-safe“)
}
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-5
… Swing-Beispiele …
Beispiel 2: Erzeugung von Buttons …
JButton button = new JButton("I'm a Swing button!");
button.setMnemonic('i');
button.addActionListener(/*...create an action listener...*/);
… und Label
...// where instance variables are declared:
private static String labelPrefix = "Number of button clicks: ";
private int numClicks = 0;
...// in GUI initialization code:
final JLabel label = new JLabel(labelPrefix + "0 ");
...// in the event handler for button clicks:
label.setText(labelPrefix + numClicks);
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-6
3
… Swing-Beispiele …
Beispiel 2: Komponenten zu Containern hinzufügen
// Create container, assign layout manager
JPanel panel = new JPanel(new GridLayout(0,1));
// Add components
panel.add(button);
panel.add(label);
// Set a border around the panel
panel.setBorder(BorderFactory.createEmptyBorder(
30, //top
30, //left
10, //bottom
30) //right
);
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-7
… Swing-Beispiele
Beispiel 2: Event Handling
public class SwingApplication implements ActionListener {
...
JButton button = new JButton("I'm a Swing button!");
button.addActionListener(this);
....
public void actionPerformed(ActionEvent e) {
numClicks++;
label.setText(labelPrefix + numClicks);
}
}
•
Wenn der Button (JButton) angekickt wird, dann wird ein ActionEvent
erzeugt, die actionPerformed-Methode des ActionListener wird
aufgerufen und das Label (JLabel) wird aktualisiert.
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-8
4
Swing-Elemente …
•
Swing-Elemente werden unterteilt in:
– Kontrollelemente/Komponenten
– Container
– LayoutManager
– Events
•
Komponenten sind die Hauptbestandteile („building blocks“) von swing
– gibt es für unterschiedliche Anwendungen
– und in unterschiedlichen Komplexitätsstufen
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-9
… Swing-Elemente
•
Container sind hierarchisch organisiert
– Top level container
– Intermediate containers
– Atomic components
(in den Blättern des Hierarchiebaumes)
•
Container-Klassen dienen dazu, Komponenten zu
gruppieren, anzuordnen und als eine einzelne
Einheit zu behandeln
•
Zur Anordnung der Elemente am Bildschirm
hat jeder Container einen Layout-Manager zugeordnet
FS 2013
z.B.
Programmier-Projekt (cs108) – Grafikprogrammierung
7-10
5
7.2 Top Level-Container
•
Auf oberster Ebene in jeder Containment Hierarchie befinden sich die
Top Level Container (Frame, Applet oder Dialog)
•
Jedes Swing-Programm hat zumindest einen davon
Applet
FS 2013
Frame
Dialog
Programmier-Projekt (cs108) – Grafikprogrammierung
7-11
Verwendung der Top Level-Container
•
Um dargestellt werden zu können, sollte jede GUI-Komponente Teil einer
containment hierarchy sein
– Eine containment hierarchy ist baumartig strukturiert,
mit dem top level-container als Wurzel
– Jede GUI-Komponente kann genau einmal in einer Hierarchie enthalten sein.
Falls eine Komponente bereits in einem Container C1 enthalten ist, dann wird
sie beim Einfügen in Container C2 automatisch aus C1 gelöscht
– Jeder top-level container hat ein so genanntes content pane, das die
sichtbaren Komponenten dieser GUI enthält (direkt oder transitiv)
– Zu einen top-level container kann man optional noch eine Menüleiste
(menu bar) hinzufügen. Diese Menüleiste ist im top level-Container enthalten,
aber ausserhalb der content pane
•
Klassen der drei top-level container:
– JFrame
– JDialog
– JApplet
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-12
6
Verwendung der Top Level Container: Root Pane
•
•
•
Das Root Pane (Hauptkomponente) ist in unsichtbarer Art und Weise an
jeden Top-Level Container angehängt
Die Hauptkomponente verwaltet alles zwischen Top Level Container und
Komponenten
– Wird automatisch von Swing bei der Erzeugung des Frames erstellt
– Platziert die Menüleiste und das ContentPane
Für die weitere Programmierung sind folgende Bestandteile der
Hauptkomponente wichtig:
– Content Pane
– Menu Bar
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-13
ContentPane
•
•
•
In der Regel wird ein JPanel verwendet
Das JPanel enthält alles, was von den meisten SwingAnwendungen benötigt wird (ausser der Menüleiste)
Es sollte explizit erzeugt werden (obwohl es eine defaultLösung gibt):
// Create a panel and add components to it
JPanel contentPane = new JPanel();
// To get the default one:
// JPanel contentPane = frame.getContentPane();
contentPane.add(someComponent);
contentPane.add(anotherComponent);
//Make it the content pane.
contentPane.setOpaque(true);
topLevelContainer.setContentPane(contentPane);
Zugehörige Containment
Hierarchy
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-14
7
MenuBar
•
Alle Top-Level Container (in Frames, evtl. auch in Applets) haben eine Menüleiste
•
Hinzufügen einer Menüleiste
1. Erzeugen des JMenuBar-Objekts und mit Menüs befüllen
2. Zum Frame hinzufügen
JMenuBar myMenuBar = new JMenuBar();
...
frame.setJMenuBar(myMenuBar);
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-15
Top Level Container: JFrame
•
Beispiel: Erzeugung eines Fensters mit Rand (border),
Titelleiste und buttons mittels JFrame:
// 1. Optional: Specify who draws the window decorations
JFrame.setDefaultLookAndFeelDecorated(true);
// 2. Create the frame
JFrame frame = new JFrame("FrameDemo");
// 3. Optional: What happens when the frame closes?
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 4. Create components and put them in the frame
// ...create emptyLabel...
frame.getContentPane().add(emptyLabel,BorderLayout.CENTER);
// 5. Size the frame
frame.pack();
// 6. Show it
frame.setVisible(true);
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-16
8
Top Level Container: Dialogboxen
Dialogboxen
• Sind in ihrer Funktionalität eingeschränkter als Frames
• Hängen von anderem Fenster ab
• Typen von Dialogen
– JDialog (ist top-level container)
– JOptionPane
– JColorChooser
– JFileChooser
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-17
Anzeige von Dialogen
JOptionPane.showMessageDialog(frame,
"Eggs aren't supposed to be green.");
•
Stellt einen Dialog mit einem Button (OK) dar
(und selbst vergebener Nachricht, Icon und Titel)
Object[] options = {"Yes, please",
"No, thanks",
"No eggs, no ham!"};
int n =
JOptionPane.showOptionDialog(frame,
"Would you like some green eggs to go "
+ "with that ham?",
"A Silly Question",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
options,
options[2]);
FS 2013
showOptionDialog
Programmier-Projekt (cs108) – Grafikprogrammierung
7-18
9
Top Level Container: Applets
• JApplet ist top-level container, der Menüleiste und content pane unterstützt
•
Erfordert ein Java-Plugin für den Web-Browser (sind keine eigenständigen
Anwendungen)
•
Applets werden in diesem Kapitel nicht weiter betrachtet
– Entspricht nicht den Vorgaben des cs108 Java-Projekts
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-19
7.3 Intermediate Container
•
•
•
Auf mittlerer Ebene der Container-Hierarchie (Intermediate Container)
unterscheidet man general-purpose container und special-purpose container
General-purpose container können für mehrere Zwecke eingesetzt werden
Swing kennt die folgenden general-purpose container:
Toolbar
Scroll Pane
Panel
Tabbed pane
Split pane
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-20
10
General-Purpose Container: JPanel
•
Container für eher leichtgewichtige Komponenten
– JPanel stellt by default zunächst nichts dar, ausser seinem Hintergrund
•
Sehr sinnvoll um eine GUI zu strukturieren
• Hauptmethoden
setLayout(…) – sets the layout manager
add(…)
– add a new component to the panel
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-21
General Purpose Container: JScrollPane
•
Code, der einen Textbereich erzeugt, in dem der Nutzer scrollen kann. Die
Scrollbar wird zu einem Container hinzugefügt
textArea = new JTextArea(5, 30);
...
JScrollPane scrollPane = new
JScrollPane(textArea);
...
setPreferredSize(new
Dimension(450, 110));
...
add(scrollPane,
BorderLayout.CENTER);
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-22
11
Special-purpose Container: Übersicht
•
•
Die special-purpose container spielen für die grafische Benutzerschnittstelle
spielen eine wichtige Rolle, da sie die überlappende Platzierung von
Komponenten unterstützen.
Es gibt die folgenden special-purpose container:
Internal Frame
Layered Pane
Root Pane
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-23
Special-purpose Container: Layered Pane
•
Werden vom root pane angeboten, können aber auch explizit erzeugt werden
•
Ein layered pane ist ein Swing-Container, der eine dritte Dimension, die depth
(Z order) für die Positionierung von Komponenten anbietet. Beim Hinzufügen
einer Komponente zur Layered Pane muss ihre depth angegeben werden.
•
Falls Komponenten überlappen werden diese mit höherer depth über den
anderen platziert
•
Depth wird als Integer spezifiziert. Default-Werte sind:
– frame content (content pane,menu bar) = -30000
– default (components) = 0
– palette (toolbar and palettes) = 100
– modal (internal dialogs) = 200
– popup (external dialogs) = 300
– drag (component when dragged) = 400
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-24
12
Special-purpose Containers: JInternalFrame
•
Fenster ähnlich wie JFrame innerhalb eines anderen Fensters
•
Wird in der Regel zu einem desktop pane hinzugefügt
(JDesktopPane ist Subklasse von JLayeredPane)
Verwendung ist ähnlich zu der von JFrame
•
– Es besitzt ein root pane
– Methode pack()
– Zur Anzeige muss setVisible(true) oder show verwendet werden
•
Aber: JInternalFrame ist kein top level-Container
– Er muss also zu einem anderen Container hinzugefügt werden
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-25
Regeln für die Verwendung von JInternalFrame
•
Grösse des internal frames muss gesetzt werden
– Default-Wert: 0
•
Positionierung
– Default-Wert: (0,0)
•
Um Komponenten zu einem internal frame hinzuzufügen müssen sie in das
internal frame der content pane aufgenommen werden
– Falls internal pane nicht zu einem Container hinzugefügt wird,
dann wird es auch nicht angezeigt!
– Verwendung von setVisible()
– Internal frames erzeugen internal frame events, keine window events
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-26
13
7.4 Atomare Komponenten: Übersicht
•
Basic Controls sind atomare Komponenten, die hauptsächlich zur Entgegennahme
von Benutzereingaben existieren
Buttons
Spinner
FS 2013
List
Combo box
Menu
Text field
Slider
Programmier-Projekt (cs108) – Grafikprogrammierung
7-27
Uneditable Information Displays: Übersicht
•
Die Uneditable Information Displays sind atomare Komponenten,
die ausschliesslich eingesetzt werden, um Informationen an die Benutzer
auszugeben
Progress Bar
Labels
FS 2013
Tool tip
Programmier-Projekt (cs108) – Grafikprogrammierung
7-28
14
Interactive Displays of Highly Formatted Information
•
Dies sind atomare Komponenten zur Ausgabe von die stark strukturierten und
formatierten Informationen, die auch von den Benutzern modifiziert werden
können
File chooser
Color chooser
Tree
•
Text
Table
Wir werden hier nicht auf alle Komponenten eingehen (können) – dies würde
schlicht den Rahmen der Vorlesung sprengen
– Für weitere Informationen sei auf die Java2 API-Dokumentation verwiesen
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-29
Die Klasse JComponent
•
•
Basisklasse für alle Swing-Komponenten, mit Ausnahme des top level-Containers
Eigenschaften:
– Tool tips:
• setToolTipText()
• Bietet den Nutzern der Komponente eine Unterstützung an
– Zeichnung und Ränder
• setBorder() – zeichnet Rahmen um die Komponente
• Um innerhalb einer Komponente zu zeichnen muss die
paintComponent()–Methode überschrieben werden
– Pluggable look & feel
•
Unterstützung des Layouts
– setPreferredSize()
– setMinimumSize(), setMaximumSize()
– setAlignmentX(), setAlignmentY()
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-30
15
7.5 Event Handling
•
Eine Klasse kann angeben, an welchen Events sie interessiert ist und
jeweils darauf reagieren
– Basiert auf ActionEvent, das bei der Interaktion mit einer Komponente
ausgelöst wird (Mausklick, Aufruf eines Menüeintrags, Eintrag in Textfeld, …)
•
Klasse muss ActionListener-Interface implementieren
public class mySwingClass implements ActionListener {
•
Der ActionListener muss an eine Komponente angefügt werden
button.addActionListener(this);
– Die jeweils relevante Aktion wird durch die Komponente definiert
•
Mit der Methode actionPerformed(ActionEvent e) kann festgelegt
werden, was beim Eintreten des Events geschieht
public void actionPerformed(ActionEvent e) {
numClicks++;
label.setText(labelPrefix + numClicks);
}
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-31
7.6 Layout Manager
•
In den allermeisten Fällen kann man sich nicht (oder möchte sich nicht)
explizit um die Positionierung und Grösse von Komponenten kümmern
– Beispiele: Vergrössern/Verkleinern eines Fensters, Wechsel der Sprache, …
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-32
16
Was sind Layout Manager?
•
Ein Layout-Manager implementiert das LayoutManager-Interface
•
Er bestimmt die Grösse und Positionierung von Komponenten in einem Container
– Komponenten können Grösse und Hinweise für die Ausrichtung
bekannt geben
Aber: die endgültige Entscheidung über Grösse und Position von Komponenten
in einem Container liegt beim Layout-Manager des Containers
•
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-33
Layout-Manager und Container
•
Default Layout-Managers
– JFrame, JDialog, und JApplet besitzen BorderLayout
– JPanel besitzt FlowLayout
(falls nicht als Content Pane verwendet – dann mit BorderLayout)
•
Der Layout-Manager eines Containers wird wie folgt gesetzt:
– JFrame frame = new JFrame();
frame.setLayout(new FlowLayout());
– JPanel contentPane = new JPanel();
contentPane.setLayout(new BorderLayout());
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-34
17
Verwendung der Layout-Manager
•
•
•
Layout-Manager werden automatisch angewandt wenn Container ihr Aussehen
ändern wollen
Die folgenden Methoden sind die Folge dieser Anwendung, die jedoch NICHT
das neue Layout erzeugen
– add(), remove(), removeALL()
– getAlignmentX(), getAlignmentY()
– getPreferredSize(), getMinimumSize(),
– getMaximumSize()
Folgende Methoden führen dazu, dass der Manager das Layout erzeugt
– JFrame.pack()
Führt dazu, dass die Grösse des Fensters ermittelt wird gemäss den
bevorzugten Grössen und Anordnungen der Komponenten
– JFrame.show() und JFrame.setVisible(true)
zeigen die Komponente an
– JComponent.revalidate()
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-35
Layout-Manager: BorderLayout
•
Definiert fünf Bereiche
– LINE_START, CENTER, LINE_END, PAGE_START, PAGE_END
•
In älteren Versionen:
– WEST, CENTER, EAST, …
•
•
Nicht alle Bereiche müssen verwendet werden
Center wird so gross gemacht wie möglich
•
Platzierung kann als Argument der add-Methode angegeben werden
– pane.setLayout(new BorderLayout());
– pane.add(component, BorderLayout.PAGE_START);
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-36
18
Layout-Manager: BoxLayout
•
Ordnet Komponenten in einer Zeile oder Spalte an
– Richtung ist wählbar
•
Grösse der Komponenten:
– Berücksichtigen Max, Min und bevorzugte Grösse der Komponenten
•
Ausrichtung
– Wenn nicht alle Komponenten dieselbe Höhe/Breite besitzen
– Angabe von Left, Center oder Right
(Top, Middle, Bottom)
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-37
Layout-Manager: FlowLayout
•
•
•
•
•
Einfache Anordnung (Default bei JPanel)
Komponenten in Zeile angeordnet
– Neue Zeile falls Container nicht ausreichend breit ist
Komponenten werden in bevorzugter Grösse dargestellt
Falls der Container breiter ist:
– Default-Ausrichtung ist zentriert
– FlowLayout.LEADING, FlowLayout.CENTER,
FlowLayout.TRAILING
Zwischenräume zwischen Komponenten können spezifiziert werden
– Default: 5
– Angabe im Konstruktor oder in setter-Methoden
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-38
19
Layout-Manager: GridLayout
•
•
Gitterzellen, die alle dieselbe Grösse besitzen
– Komponenten werden in einer kompletten Zelle platziert
Zwischenräume
– Default = 5
– Verwendung von setter-Methoden (setHgap(), setVgap())
•
– Bzw. den Konstruktor
Zellen werden angepasst um so gross wie möglich zu sein
(im vorgegebenen Fenster)
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-39
Layout-Manager: GridBagLayout
•
Sehr flexibel (aber auch kompliziert)
– Zeilen können unterschiedliche Höhen besitzen
– Spalten können unterschiedliche Längen besitzen
– Verwendet Zellen im Grid
GridBagLayout gridBag = new
GridBagLayout();
GridBagConstraints c = new
GridBagConstraints();
Jpanel pane = new Jpanel();
pane.setLayout(gridBag);
// For each component to be added to
this container
// ... Create component ...
// ... Set instance variables in
// the GridBagConstraints instance ...
gridBag.setConstraints(theComponent, c);
pane.add(theComponent);
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-40
20
Layout-Manager: GridBagLayout
Constraints
• Setzen eines gridBagConstraints-Objekts
– gridx, gridy
Zeile und Spalte der oberen linken Ecke der Komponente
– anchor
wo soll die Ausgabe hinkommen innerhalb der Zelle wenn
die Komponente kleiner ist
– fill
wie kann die Grösse verändert werden falls die Zelle
grösser ist als die Komponenen
– insets
minimaler Abstand zwischen Komponente und Kanten
der Zelle
– ipadx, ipady
(internal padding) was soll zur minimalen Grösse der
Komponenten hinzugefügt werden
– weightx, weighty – wie wird der zusätzliche Platz verteilt
– gridwidth, gridheight – Anzahl der Spalten oder Zeilen, die von der
Komponente verwendet werden
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-41
Layout-Manager: GridBagLayout
JButton button;
pane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
Beispiel (Fortsetzung)
c.fill = GridBagConstraints.HORIZONTAL;
...
button = new JButton("Button 1");
button = new JButton("5");
c.weightx = 0.5;
c.ipady = 0; //reset to default
c.gridx = 0;
c.weighty = 1.0;
c.gridy = 0;
//request any extra vertical space
pane.add(button, c);
c.anchor = GridBagConstraints.PAGE_END;
button = new JButton("Button 2");
//bottom of space
c.gridx = 1;
c.insets = new Insets(10,0,0,0);
c.gridy = 0;
//top padding
pane.add(button, c);
c.gridx = 1; //aligned with button 2
button = new JButton("Button 3");
c.gridwidth = 2; //2 columns wide
c.gridx = 2;
c.gridy = 2; //third row
c.gridy = 0;
pane.add(button, c);
pane.add(button, c);
button = new JButton("Long-Named Button 4");
c.ipady = 40; //make this component tall
c.weightx = 0.0;
c.gridwidth = 3;
c.gridx = 0;
c.gridy = 1;
pane.add(button, c);
...
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-42
21
Layout-Manager: CardLayout
•
Verwaltet Objekte (normalerweise Jpanels) in Mengen
•
Arbeitet etwa wie ein tabbed pane
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-43
Einen Layout-Manager auswählen …
•
Anzeige einer Komponente innerhalb einer so grossen Fläche wie möglich
– BorderLayout
• Komponente im Zentrum
– GridBagLayout
• fill = GridBagConstraints.BOTH
– BoxLayout
• Komponente spezifiziert hohe Werte für bevorzugte / maximale Grösse
•
Anzeige einiger Komponenten in einer Zeile
– Default FlowLayout von Jpanel
– BoxLayout
•
Anzeige einiger Komponenten derselben Grösse in Zeilen und Spalten
– GridLayout
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-44
22
… Einen Layout-Manager auswählen
•
Anzeige einiger Komponenten in einer Zeile oder Spalte mit unterschiedlichen
Abständen und individuellen Komponentengrössen
– BoxLayout
•
Anzeige eines komplexen Layouts mit vielen Komponenten
– GridBagLayout
– Gruppierung der Komponenten in JPanels um das Layout zu vereinfachen.
Jedes JPanel kann einen unterschiedlichen Layout-Manager verwenden
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-45
Ohne Layout-Manager (absolute Positionierung)
•
Dies sollte unbedingt vermieden werden, ausser:
– Komponentengrösse wird nicht durch die Containergrösse oder Font
beeinflusst
– Container führt Berechnungen zu Grösse und Positionierung durch,
die speziell für diesen Container ausgerichtet sind und die evtl. auch den
Zustand des Containers berücksichtigen (z.B. split panes)
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-46
23
Ohne Layout-Manager (absolute Positionierung)
pane.setLayout(null);
Beispiel
JButton b1 = new JButton("one");
JButton b2 = new JButton("two");
JButton b3 = new JButton("three");
pane.add(b1);
pane.add(b2);
pane.add(b3);
Insets insets = pane.getInsets();
Dimension size = b1.getPreferredSize();
b1.setBounds(25 + insets.left, 5 + insets.top,
size.width, size.height);
size = b2.getPreferredSize();
b2.setBounds(55 + insets.left, 40 + insets.top,
size.width, size.height);
size = b3.getPreferredSize();
b3.setBounds(150 + insets.left, 15 + insets.top,
size.width + 50, size.height + 20);
...//In the main method:
Insets insets = frame.getInsets();
frame.setSize(300 + insets.left + insets.right,
125 + insets.top + insets.bottom);
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
Darstellung eines Frames im Full Screen-Modus
•
7-47
.
Es gibt mehrere Möglichkeiten, ein Frame in maximaler Grösse
darzustellen (Full Screen-Modus)
– OS-abhängig
– z.B. Verwendung von java.awt.Toolkit
import java.awt.Toolkit;
public class FullScreen {
JFrame frame;
public FullScreen() {
frame = new JFrame("FullScreen");
...
Toolkit tk = Toolkit.getDefaultToolkit();
int xSize = ((int) tk.getScreenSize().getWidth());
int ySize = ((int) tk.getScreenSize().getHeight());
frame.pack();
frame.setSize(xSize,ySize);
frame.setVisible(true);
}
...
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-48
24
Literatur
•
Creating a GUI with JFC/Swing (The Swing Tutorial)
– http://docs.oracle.com/javase/tutorial/uiswing/index.html
– Beispiele und Abbildungen dieses Kapitels stammen grösstenteils aus
diesem Tutorial
•
Grundlagen von JFC/Swing I & II
– http://192.9.162.55/products/jfc/learning/tutorial/index.html
•
Effective Layout Management: Kurzübersicht
– http://192.9.162.55/developer/onlineTraining/awt/contents.html
FS 2013
Programmier-Projekt (cs108) – Grafikprogrammierung
7-49
25

Documentos relacionados