Layout Manager Astrid Beck FHT Esslingen Layout Manager Layout Manager arrangieren den Inhalt eines Containers gemäß vorgegebener Regeln Layout Manager BorderLayout North, South, East, West, Center FlowLayout jedes Element zur Rechten des vorhergehenden, wrap GridLayout Reihen und Spalten von gleicher Größe BoxLayout Komponenten in einer Reihe oder in einer Spalte, mit Strut und Glue für Abstände GridBagLayout Reihen und Spalten, flexibel und komplex CardLayout Panels können überlappen; different components at different times OverlayLayout übereinanderliegende Ebenen ScrollPaneLayout mit viewport, 2 scrollbars, row header, column header, 4 "corner" components SpringLayout flexibel, kann alle anderen emulieren, für GUI Builder ViewportLayout bestimmen eines Default Layout, mit Minimum Size Null-Layout alle Maße werden explizit definiert; ist zu vermeiden! 2 1
Layout Manager Container haben einen Default Layout Manager Panel & Applet -> FlowLayout Window, Frame, & Dialog -> BorderLayout Der Layout Manager eines Containers kann geändert werden mit der setlayout (LayoutManager) -Methode Layout manager sind Objekte der Klasse, die das LayoutManager interface implementiert: Beispiel public class GridLayout implements LayoutManager Panel pnl = new Panel(); pnl.setlayout (new GridLayout (0, 4)); // 4 Spalten 3 BorderLayout Definiert 5 Bereiche: North, South, East, West, Center Diese müssen nicht alle belegt sein Nur eine Komponente in jedem Bereich (kann ein Container sein) Resize der Komponenten ist möglich: NORTH und SOUTH werden horizontal gedehnt EAST und WEST werden vertikal gedehnt CENTER wird in alle Richtungen gedehnt, um verbleibenden Platz auszufüllen Default Layout Manager für Window, Frame, Dialog Add kann auf zwei Arten aufgerufen werden: add (String, Component) String ist North, South, East, West, Center add (Component, BorderLayout.location) location ist NORTH, SOUTH, EAST, WEST, CENTER (=default, kann weggelassen werden) 4 2
BorderLayout North West Center East South 5 BorderLayout import java.awt.*; import java.awt.event.*; public class BorderExample extends Frame { public BorderExample () { Frame f = new Frame ("Layout Manager Test"); // Frame's Default Layout Manager ist BorderLayout Label toplbl = new Label ("Beispiel BorderLayout", Label.CENTER); f.add ("North", toplbl); Label westlbl = new Label ("Bitte Text eingeben", Label.LEFT); f.add ("West", westlbl); f.add ("Center", new TextArea (10, 80)); f.add ("South", new Button ("Save")); f.pack(); //Causes this Window to be sized f.setvisible (true); } } 6 3
Übung: bitte zeichnen 7 public class BorderTest { public static void main (String[] args) { new BorderExample(); } } BorderLayout 8 4
BorderLayout - Swing 9 FlowLayout Addiert Komponenten von links nach rechts, bricht ggf. um Layout wird neu angeordnet bei Fenstergrößenänderung Die Größe der Komponenten wird nicht verändert Ausrichtung kann spezifiziert werden Abstand zwischen Komponenten kann spezifiziert werden FlowLayout (int align, int hgap, int vgap) optional: align = Ausrichtung hgap, vgap = horizontale und vertikale Abstände 10 5
FlowLayout 11 GridLayout Komponenten werden in einem Grid (Raster) angeordnet Komponenten erhalten die Maße des größten Objekts Reihen und Spalten können spezifiziert werden Wenn nur eins definiert wird, werden die anderen entsprechend verteilt Wenn nur Beides definiert wird, wird die Angabe der Spalten ignoriert Beispiel: new GridLayout (2, 4) // 2 rows,? columns new GridLayout (0, 4) // 4 columns new GridLayout (2, 0) // 2 rows Abstand zwischen Komponenten kann spezifiziert werden 12 6
GridLayout 13 GridLayout import java.awt.*; public class GridTest1 extends Frame { public GridTest1() { Frame f = new Frame ("GridLayout1"); f.setlayout (new GridLayout (0, 2, 0, 5)); f.add (new Label ("Name, Vorname", Label.LEFT)); f.add (new TextField (20)); f.add (new Label("Strasse", Label.LEFT)); f.add (new TextField (20)); f.add (new Label ("Land", Label.LEFT)); f.add (new TextField (20)); f.add (new Label("PLZ / Ort", Label.LEFT)); f.add (new TextField (20)); f.pack(); f.setvisible (true); } } 14 7
Übung: bitte zeichnen 15 GridLayout 16 8
Schachteln von Containern Komplexere Anordnungen von Komponenten kann durch Schachtelung verschiedener Layout Manager erreicht werden Beispielsweise kann ein Frame ein BorderLayout haben; die North-, Center- und South-Positionen können mehrere Komponenten mit verschiedenen Layout Managern beinhalten 17 Schachteln von Containern 1 public class NestingTest extends Frame { public NestingTest () { // Erzeugen eines Fensters Frame f = new Frame ("NestingTest"); // north Label toplbl = new Label ("Geschachtelte Layout Manager", Label.CENTER); f.add (BorderLayout.NORTH, toplbl); 18 9
Schachteln von Containern 2 // 2 GridLayout-Panels Panel centerpnl = new Panel(); Panel centerpn2 = new Panel(); centerpnl.setlayout (new GridLayout (4, 1, 0, 5)); centerpn2.setlayout (new GridLayout (4, 1, 0, 5)); centerpnl.add (new Label ("Name, Vorname", Label.LEFT)); centerpn2.add (new TextField (40)); centerpnl.add (new Label ("Strasse", Label.LEFT)); centerpn2.add (new TextField (40)); centerpnl.add (new Label ("Land", Label.LEFT)); centerpn2.add (new TextField (40)); centerpnl.add (new Label ("PLZ / Ort", Label.LEFT)); centerpn2.add (new TextField (40)); 19 Schachteln von Containern 3 // f-north with own panel Panel northp = new Panel(); northp.setlayout (new BorderLayout()); northp.add (centerpnl, BorderLayout.WEST); northp.add (centerpn2, BorderLayout.CENTER); f.add(northp, BorderLayout.NORTH); 20 10
Schachteln von Containern 4 // south Panel southpnl = new Panel(); southpnl.setlayout (new FlowLayout(FlowLayout.RIGHT)); southpnl.add (new Button ("Speichern")); southpnl.add (new Button ("Abbrechen")); f.add (BorderLayout.SOUTH, southpnl); f.pack(); f.setvisible (true); 21 Schachteln von Containern 22 11
Übung - Excersise TextArea (10, 80) placed in CENTER changes its size develop the code in such a way that TextArea (10, 80) should always keep its size (no resize) Use BorderLayout only 23 24 12
BoxLayout In einer horizontalen Box sind Komponenten horizontal, von links nach rechts angeordnet In einer vertikalen Box sind Komponenten vertikal, von oben nach unten angeordnet Horizontal oder Vertikal hat nichts mit der Form der Box zu tun 25 BoxLayout BoxLayout ist das Default Layout für einen Box container. s. Beispiel: Box box1 = Box.createHorizontalBox(); box1. add (...); // add a spacer, 60 pixels: box1.add(box.createhorizontalstrut (60); Box box2 = Box.createVerticalBox();... 26 13
BoxLayout Container c = getcontentpane(); c.setlayout(new FlowLayout() ); Box box = Box.createVerticalBox(); box.add (new JButton ("Next Slide")); box.add (new JButton ("Previous Slide")); box.add (Box.createVerticalStrut (20) ); box.add (new JButton ("Exit")); c.add (box); 27 GridBagLayout Ermöglicht die flexible Anordnung von Gestaltungselementen Statt Schachtelung von Layout Managern Steuerung der Anordnung mittels GridBagConstraints-Objekt mit folgenden Attributen: public int gridx = GridBagConstraints.RELATIVE; public int gridy = GridBagConstraints.RELATIVE; public int gridwidth = 1; public int gridheight = 1; public double weightx = 0.0; public double weighty = 0.0; public int anchor = GridBagConstraints.CENTER; public int fill = GridBagConstraints.NONE; public Insets insets = new Insets( 0, 0, 0, 0 ); public int ipadx = 0; public int ipady = 0; s. http://java.sun.com/docs/books/tutorial/uiswing/layout/gridbag.html sowie P.Vorobiev, M.Robinson: Swing, S. 116ff. 28 14
GridBagLayout 29 GridBagLayout 30 15
GridBagLayout Windows L&F 31 Look & Feel try { // System L&F UIManager.setLookAndFeel (UIManager.getSystemLookAndFeelClassName()); // Metal (eins von beiden) UIManager.setLookAndFeel ("javax.swing.plaf.metal.metallookandfeel"); UIManager.setLookAndFeel (UIManager.getCrossPlatformLookAndFeelClassName()); // läuft nur für das entsprechende System UIManager.setLookAndFeel ("com.sun.java.swing.plaf.windows.windowslookandfeel"); UIManager.setLookAndFeel ("javax.swing.plaf.mac.maclookandfeel"); } catch(exception e) { System.out.println("Error setting LAF: " + e); } 32 16
LowVisionMetalLookAndFeel 33 Literatur A Visual Guide to Layout Managers http://java.sun.com/docs/books/tutorial/uiswing/layout/index.html P.Vorobiev, M.Robinson: Swing, S. 116ff Applying Java Layout Managers to Graphical User Interfaces, Part 1,2 http://www.interex.org/pubcontent/enterprise/may00/13chew.html http://www.interex.org/pubcontent/enterprise/jul00/08chew.html http://www.galileocomputing.de/openbook/javainsel3/javainsel_150018. htm#rxxjavainsel_150018256allesauslegungssachedielayoutmanager Understanding Layouts in SWT http://eclipse.org/articles/understanding%20layouts/understanding%20 Layouts.htm LowVisionMetalLookAndFeel http://www.sun.com/access/developers/developing-accessibleapps/appendix.html 34 17
35 Klausuraufgabe 36 18