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