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