420 likes | 671 Views
Java GUI mit Swing. Historie der Graphikbibliotheken in Java. Graphikbibliotheken Abstract Window Toolkit (Awt) seit Java-Version 1.0 Neues Event-Modell seit Java-Version 1.1 Swing als Bestandteil der JFC seit Java Version 1.2 zusätzliche Bibliotheken zum Zeichnen Java 2D Java 3D.
E N D
Historie der Graphikbibliotheken in Java • Graphikbibliotheken • Abstract Window Toolkit (Awt) seit Java-Version 1.0 • Neues Event-Modell seit Java-Version 1.1 • Swing als Bestandteil der JFC seit Java Version 1.2 • zusätzliche Bibliotheken zum Zeichnen • Java 2D • Java 3D
Awt - Paket java.awt Abstract Window Toolkit (Awt) • In allen Java-Versionen verfügbar • Überschaubare Anzahl von graphischen Komponenten • Awt-Objekte benutzen nativen Code • Unterschiedliches Look-and-Feel auf verschiedenen Plattformen • Von SUN nicht mehr gepflegt • Zwecks Kompatibilität und als Basis für Swing weiterhin in Java vorhanden
Swing - Paket javax.swing Swing • Seit dem JDK 1.2 (Java 2) zum Standard gehörig • Als zusätzliches Paket für das JDK 1.1.x verfügbar • Zu 100% in Java programmiert • Gleiches Look-And-Feel auf allen Plattformen • Look&Feel kann vom Benutzer angepasst bzw. neu erstellt werden • Große Anzahl an graphischen Komponenten, die • im Aussehen und Verhalten geändert werden können • vereinfachtes MVC-Entwurfsmuster benutzen • Langsamer als das Awt • Nachfolger des Awt
Unterschiede zwischen Swing und Awt • Swing-Buttons und Labels können neben Text zusätzlich auch Bilder anzeigen • Ein Rahmen, der um alle Swing-Komponenten gezeichnet werden kann, kann gesetzt bzw. geändert werden • Das Verhalten von Swing-Komponenten kann leicht geändert werden • Swing-Komponenten müssen nicht rechteckig sein, sondern können eine beliebige Form annehmen • Informationen (Text, Farbe usw.) können leicht von Swing-Komponenten abgefragt werden
Container und Komponenten • Container • Container sind Objekte, die Komponenten über die add()- Methode aufnehmen können • Container können auch Container aufnehmen • Container sind für die Anordnung der aufgenommenen Elemente zuständig • Container müssen keine graphische Repräsentation haben • Komponenten • Komponenten sind Objekte, die immer eine graphische Repräsentation haben (Schaltfläche, Optionsfeld, etc.) • Benutzer kann mit ihnen interagieren
Container • Hauptfenster / Top-Level-Container • Basis einer Swing-Oberfläche • JFrame, JDialog, JApplet, JWindow (, JOptionPane) mit ContentPane BorderLayout als Standard-Layout • Weitere Container • JPanel (mit FlowLayout als Standard-Layout) • JTable, JTree, JTabbedPane, JOptionPane, ... ohne ContentPane
ContentPane • Default-Container unterhalb aller Top-Level-Container • Enthält alle weiteren Container und Komponenten des übergeordneten Top-Level-Containers • Ausnahme: Menuleiste wird im Top-Level-Container direkt abgelegt (genauer: im LayeredPane) • z.B. frame.setJMenuBar(menubar) • Hinzufügen von Containern und Komponenten • z.B. frame.getContentPane().add(cmp); • Festlegen des Layouts von Top-Level-Containern • z.B. dialog.getContentPane().setLayout(layout); • Löschen von Komponenten aus Top-Level-Containern • z.B. applet.getContentPane().remove(cmp);
Layoutmanager • Jeder Container hat ein Standard-Layout; es kann auch ein anderes Layout gewählt werden • BorderLayout (Standard bei Top-Level-Container) • Enthält nur 5 Elemente, die durch North, West, South, East und Center platziert werden können • FlowLayout (Standard bei JPanel) • Alle Elemente werden hintereinander platziert (von links nach rechts und dann von oben nach unten) • GridLayout(int rows, int colums) • Schachbrettmuster mit Anzahl Zeilen und Spalten • GridBagLayout • Flexible Gestaltung des Layouts • null-Layout • Gestaltung des Layouts durch Positionsangaben (x,y)
Die Klasse JFrame • Besitzt einen Rahmen, einen Titel und Schaltflächen zum Schließen und Verkleinern des Fensters • Mindestbestandteil einer Anwendung mit graphischer Benutzeroberfläche
Die Klasse JFrame • Konstruktoren • public JFrame() • public JFrame(String title) • Legen ein Fenster an, das standardmäßig unsichtbar ist und evtl. einen Titel enthält • Methoden • JFrame frame = new JFrame() • frame.setLocation(200, 200); • frame.setSize(300, 200); // Breite, Höhe • frame.setVisible(true); • pack(); // Fenstergröße wird autom. berechnet; // statt setSize(): • frame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); Legt Verhalten beim Schließen des Fensters fest: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE,DISPOSE_ON_CLOSE • Window-Event • später
Die Klasse JDialog • Fenster mit speziellen Eigenschaften • Modal / nicht modalModal: bleibt bis zur Beendigung des Dialogs im Vordergrund und sperrt alle anderen Fenster der Anwendung • Hat Besitzer • Kann abhängig vom aufrufenden Fenster oder Dialog sein • Wird auch zerstört, minimiert, maximiert o. ä. • Sehr ähnlich Eigenschaften wie JFrame und z. T. gleiche Methoden: • setSize() und pack() • setVisible() • setDefaultCloseOperation()
Die Klasse JPanel • Meist genutzter und flexibelster Zwischencontainer • Dient der Gruppierung von Komponenten, um • logische Zusammenhänge besser darzustellen • Fenster und Dialoge besser gestalten zu können • Besitzt als Standardlayout das FlowLayout • Kann einen Rahmen und eine Beschriftung haben • setOpaque()ändert die Sichtbarkeit eines Panelssiehe API • Beispiel: JPanel buttonPanel = new JPanel(new GridLayout(1,2)); buttonPanel.add(okButton); getContentPane().add("South", buttonPanel);
Schaltflächen • Unterschiedliche Arten von Schaltflächen, die alle von der Klasse AbstractButton abstammen • Häufig genutzte Arten sind: • JButton: „Gewöhnliche” Schaltfläche (z. B. „OK“-Button) • JCheckBox: Kontrollkästchen, steht häufig neben anderen Kontrollkästchen, die einzeln angewählt werden könne • JRadioButton: Optionsfeld, meist in einer Optionsgruppe, nur ein Optionsfeld sollte aktiviert sein • JToggleButton: Umschaltbutton, der in einem gedrückten und nicht gedrückten Zustand sein kann
Schaltflächen: Methoden • Einige grundlegende Funktionalitäten, die bei allen Schaltflächen identisch, da sie von der Oberklasse AbstractButton abstammen • public void setMnemonic(char mnemonic)Setzt das Tastaturkürzel für die entsprechende Schaltfläche, wobei das Kürzel als ein Buchstabe angegeben wird • public void setSelected(boolean b)Ändert den Selektionsstatus einer Schaltfläche. Diese Methode ruft jedoch kein Action-Event hervor. Um z. B. bei einem JButton das Drücken der Schaltfläche zu simulieren, muss die Methode doClick() genutzt werden. • public boolean isSelected()Gibt an, ob eine Schaltfläche selektiert wurde oder nicht. Diese Methode ist besonders wichtig bei Optionsfeldern und Kontrollkästchen. • public void doClick()Simuliert programmtechnisch ein „Click“ auf eine Schaltfläche. Es ist identisch mit der Benutzeraktion des Drücken und Loslassen der Schaltfläche. • Weitere Methoden: • public void setBorder(Border border):Rahmen festlegen • public void setToolTipText(String text)Anlegen einer Kurzinformation • public void setEnabled(boolean b)Aktivieren oder Deaktivieren eines Button
JButton • Initialisierung mit einem Text, einem Bild, mit beidem oder mit nichts • Konstruktoren: • public JButton()Legt eine Schaltfläche ohne Bild und Text an • public JButton(String text)Legt eine Schaltfläche mit einem Text an • public JButton(String text, Icon icon)Legt eine Schaltfläche mit einem Text und einem Bild an • Weiter Methoden: • public boolean isDefaultButton()Gibt an, ob ein JButton der Default-Button ist. Ein Default-Button ist der JButton, welcher als „angeklickt” angesehen wird, wenn im Fenster bzw. Dialog die ENTER-Taste gedrückt wird. • public boolean isDefaultCapable()Gibt an, ob ein JButton als Default-Button definiert werden darf oder nicht • public void setDefaultCapable(boolean defCap)Setzen der Fähigkeit Default-Button zu sein oder nicht • Methoden zur Ausrichtung siehe JLabel
JLabel • Enthält kurze Texte, Bilder oder beides • Reagiert nicht auf Eingaben und erhält nie den Fokus • Dient zur Erklärung oder Erläuterung anderer Komponenten • Ausrichtung manuell oder Standard • Beispiel: • textPanel.add (new JLabel("Vorname:")); • JLabel label = new JLabel("PLZ", SwingConstants.RIGHT) • Weiter Methoden: • public void setHorizontalTextPosition(int textPosition); • public void setHorizontalAlignment(int alignment); • public void setVerticalAlignment(int alignment); Festlegung (und Abfrage mit get...) der Anordnung (LEFT, RIGHT) sowie der horizontalen (LEFT, CENTER, RIGHT) und vertikalen (TOP, CENTER, BUTTOM) Ausrichtung des Textes bzw. Icons auf dem Button. Die Konstanten sind aus dem Swing-Interface SwingConstants.
JTextField, JPasswordField • Für die Eingabe von Werten (mit * o.a. Zeichen bei JPasswortField) • Ausrichtung manuell oder Standard, siehe JLabel • Einige Konstruktoren: • public JTextField()Default-Konstruktor, der ein Eingabefeld erzeugt, welches keinen Wert enthält und dessen Spaltenanzahl 0 ist. • public JTextField(String text, int columns)Eingabefeld mit Inhalt und begrenzter Spaltenanzahl. • Gleiche Methoden wie bei JLabel und zusätzlich: • public String getText()Liefert den Text eines Eingabefeldes • public void setText(String text)Setzen / Ändern des Textes eines Eingabefeldes • Weiter siehe API • Beispiel: JTextField tfName = new JTextField(5); tfName.setToolTipText("Geben Sie ihren Namen ein"); textPanel.add(tfName);
Event Handling Model 2. x-Icon wird geklickt 3. Fenster erzeugtein Event-Objekt EO 4. Fenster verschickt das EO an alle Event-Listener(Methodenaufruf) 1. Java-Programm meldet sich als Event-Listener beim Fenster für das Fenster-Schließen an Java-Programm 5. Java-Programm führt gewünschte Aktionen aus
Event Handling: Listener oder Adapter • Listener ist ein Interface: • alle Methoden müssen implementiert werden • Mehrere Interfaces können genutzt werden (implements i1 ,i2, i3) • Adapter ist eine Superklasse: • Nur diejenigen Methoden müssen überschrieben werden, die verändert werden sollen • Es kann nur von einer Superklasse geerbt werden (extends sk) • Verwendung einer anonymen Klasse: • Eine anonyme Klasse wird im Parameter mittels new aus WindowAdapter abgeleitet: this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { schliessen(); } });
Event Handling Beispiel mit Listener public class Frame6 extends JFrame implements ActionListener { JButton okButton, cancelButton; public Frame6() { okButton = new JButton("OK"); cancelButton = new JButton("Abbrechen"); // Anmelden bei den Buttons okButton.addActionListener(this); cancelButton.addActionListener(this); : } // Folgende Methode wird durch das Interface ActionListener // deklariert und muss hier implementiert werden. public void actionPerformed(ActionEvent e) { if (e.getSource() == okButton) { System.out.println ("OK-Button"); } if (e.getSource() == cancelButton) { System.out.println ("Abbrechen-Button"); // dispose(); } } }
Event Handling Beispiel mit Adapter public class Frame7 extends JFrame { JButton okButton, cancelButton; MyMouseAdapter mMA = new MyMouseAdapter(); : public Frame7() { okButton.addMouseListener(mMA); cancelButton.addMouseListener(mMA); : } // Innere Klasse mit Überschreiben d. Method.der Klas. MouseAdapter class MyMouseAdapter extends MouseAdapter { public void mouseClicked(MouseEvent e) { if (e.getSource() == okButton) System.out.println ("OK-Button"); if (e.getSource() == cancelButton) System.out.println ("Abbrechen-Button"); } public void mouseEntered(MouseEvent e) { if (e.getSource() == okButton) System.out.println ("Drück OK"); if (e.getSource() == cancelButton) { System.out.println ("Drück Abbrechen"); } }
Event Handling mit anonym. Windows List. public class Frame8 extends JFrame { : public Frame8() { // Variante: Steuerung des Windows-Schließens // mit anonyme Window-Listener Klasse this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { schliessen(); } }); } // Fenster schließen (siehe auch Abbrech-Button) void schliessen() { int i = JOptionPane.showConfirmDialog (this, "Wollen Sie aufhören?", "Beenden", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE); if (i == JOptionPane.YES_OPTION) { dispose(); System.exit(0) ; } }
JCheckBox • Zustand: an oder aus • Konstruktor und Methoden • JCheckBox cbSchwimmen = new JCheckBox("Schwimmen") ;Konstruktor mit Text • if (cbSchwimmen.isSelected()) hobbies += "Schwimmen; ";liefert true, wenn ausgewählt • cbSchwimmen.addItemListener(this);Nutzung des Interface ItemListener, um auf Änderung zu reagieren: public void itemStateChanged(ItemEvent e) { // analog für die anderen Checkboxes oder Radiobuttons: if (e.getSource() == cbSchwimmen) { int change = e.getStateChange(); if (change == ItemEvent.SELECTED) { System.out.println(cbSchwimmen.getText() + ": selektiert"); } } }
JRadioButton, ButtonGroup • Innerhalb einer ButtonGroup (Radiogroup) ist nur 1 RB selektiert • Konstruktor und Methoden • JRadioButton rbW = new JRadioButton("W") ;Konstruktor mit Text • rbW.setMnemonic(KeyEvent.VK_W); rbW.setToolTipText("Weiblich"); • if (rbW.isSelected()) System.out.println ("Geschlecht: weiblich");liefert true, wenn ausgewählt • rbW.addItemListener(this);Nutzung des Interface ItemListener und auf Änderung reagieren, s. JCheckBox
JComboBox • Konstruktoren: • public JComboBox()Default-Konstruktor; legt ein Kombinationsfeld ohne Werte an; diese können jedoch mit der Methode addItem()hinzugefügt werden • public JComboBox(Object[] items)Kombinationsfeld, das die Werte des Array anzeigt • public JComboBox(ComboBoxModel aModel)Kombinationsfelds, das seinen Inhalt aus einem korrespondierenden Modell nimmt • public JComboBox(Vector items)Kombinationsfeld, das die Werten des übergebenen Vektors als Listeninhalt nimmt
JComboBox • Methoden: • public void setEditable(boolean aFlag)Ändert die Editierbarkeit eines Kombinationsfelds • public boolean isEditable()Stellt fest, ob das Kombinationsfeld editierbar ist • public void setSelectedItem(Object anObject)Setzt das übergebene Objekt als selektiert, wenn es in der Werteliste steht; existiert das Objekt nicht, wird das erste Objekt selektiert • public Object getSelectedItem()Liefert das aktuell selektierte Objekt • public void setSelectedIndex(int anIndex)Setzt das Objekt mit dem angegebenen Index als selektiert; das erste Objekt der Liste hat Index 0 • public int getSelectedIndex()Liefert den Index des aktuell selektierten Objekts; Rückgabewert –1, wenn kein Objekt selektiert ist • usw.
JList • Konstruktoren und Methoden (weiter siehe API) JList groesseListe; String [] groesse = {"100%", "75%", "50%", "25%"}; groesseListe = new JList (groesse); : int[] anzElement = groesseListe.getSelectedIndices(); String ausgewaehlteGroessen = ""; for (int i=0; i < anzElement.length; i++) { ausgewaehlteGroessen += (groesseListe.getSelectedValues()[i] + ";"); } System.out.println ("Größe(n): " + ausgewaehlteGroessen);
JList • Mehrfaches Löschen in einer Liste void loeschen(ActionEvent e) { // Alternative 1: nur 1 Zeile selektieren landListe.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); Countries.getModel().removeElementAt (countryList.getSelectedIndex()); : // Alternative 2: Fuellen eines int-Arrays mit den ausgewählten Indexpositionen int[] anzElement = landListe.getSelectedIndices(); for (int i=0; i < anzElement.length; i++) { // durch das Löschen einer Zeile muss das i korrigiert werden, // da jeweils 1 Position entfällt landListe.removeElementAt(anzElement[i]-i); } }
JSlider (Schieberegler), JScrollBar, JProgressBar • JSlider: Konstruktoren und Methoden (weiter siehe API) JSlider slider; // Slider erzeugen mit // Minimum = 0, Maximum = 200, Schrittweite = 10 slider = new JSlider (0, 200, 10); : System.out.println ("Fortschritt: " + slider.getValue() + " von " + slider.getMaximum() + " = " + (double)slider.getValue()/slider.getMaximum()*100 + "%"); • JScrollBar ähnlich dem JSlider (anderes Aussehen) • JProgressBar für Fortschrittsanzeige • Details siehe API
JScrollPane • Konstruktoren • public JScrollPane(Component view)Legt eine SCrollPane für die Komponente an, wobei die Scheiberegler bei Bedarf angezeigt werden • public JScrollPane(Component view, int vsbPolicy, int hsbPolicy)JScrollPane mit zwingendem vertikalen bzw. horizontalem Schieberegler • Methoden • public void setColumnHeaderView(Component view)Anzeige der Spaltenheader (Zeilenheader analog) • Beispiel: Siehe Tabelle.java
JOptionPane, JSplitPane, JTabbedPane • JOptionPane • Dialog für einfache Eingabe oder Nachricht • JSplitPane • Aufteilen des Fensters in zwei Teile, deren Separator vom Anwender verschiebbar ist • JTabbedPane • Dialog mit Registerkarten (Reitern)
JFileChooser • JFileChooser zur Auswahl einer Datei / eines Verzeichnisses String dateiname = "Textdatei.txt"; File startVerz = new File ("c:/temp"); //oder "c:\\temp" : // Dateidialog zur Auswahl der Textdatei JFileChooser jfco = new JFileChooser(); jfco.setCurrentDirectory(startVerz); jfco.setDialogTitle("Wähle Textdatei"); if (jfco.showOpenDialog(jfco) == JFileChooser.APPROVE_OPTION) { String sFileChoosed = jfco.getSelectedFile().getName(); // JOptionPane.showMessageDialog (null, "Ausgewählt: " + sFileChoosed); dateiname = sFileChoosed; }
JTable • Anzeige einer Tabelle mit Tabellenkopf, Zeilen und Spalten • Konstruktor • public JTable(Object[][] rowData, Object[] columnNames)Übergabe der Tabellendaten im 2-dim. Array und des Tabellenkopfes im 1-dim. Array • public JTable(Vector rowData, Vector columnNames)Übergabe der Tabellendaten im Array-Vector und des Tabellenkopfes im Vector • public JTable(TableModel dm, TableColumnModel cm, ListSelectionModel sm)Übergabe der Tabellendaten in Tabellenmodellen • Beispiel siehe Tabelle.java
JTable import java.awt.*;import java.awt.event.*;import javax.swing.*; public class Tabelle extends JFrame implements Buchdaten { public Tabelle(String ueberschrift, JTable buchTabelle) { super("Bibliotheksverwaltung"); getContentPane().add(new JLabel(ueberschrift), "North"); getContentPane().add(new JScrollPane(buchTabelle), "Center"); } public static void main(String[] args) { final String ueberschrift = "Bücherliste"; /* final String[] TABELLENKOPF = {"Titel", "Autor", "Ausleiher", "Ausleihdatum", "Rueckgabedatum" }; */ String[][] tabellenDaten = BUCHDATEN; final String[] TABELLENKOPF = KOPFZEILE; JTable buchTabelle = new JTable(tabellenDaten, TABELLENKOPF); buchTabelle.setValueAt("Meier", 1,2); System.out.println(buchTabelle.getValueAt(1,2)); Tabelle frame = new Tabelle(ueberschrift, buchTabelle); frame.setLocation(100, 100); frame.setSize(600, 200); frame.setVisible(true); } }
JTree • Anzeige einer Baum-Hierarchie mit Wurzel und Blättern • Beispiel siehe Baum.java
JMenuBar, JMenu • Anlegen einer Menüleiste mit Menüs und Untermenüs • Starten von zugeordneten Aktionen • Siehe JMenuBibliothek.java