INE2Java Applikationen, Swing/JFC
■ Anwendungen mit GUI
■ Swing/JFC■ Menus
■ Weitere Komponenten
■ Layouts■ Look & Feel
2 von 57School of Engineering © K. Rege, ZHAW
Frames und WindowEvents
3 von 57School of Engineering © K. Rege, ZHAW
Applikationen mit Applikationen mit GUIsGUIs
■ Die Klasse JFrame stellt ein Fensterauf dem Desktop dar
class MyFrame extends JFrame
■ Klasse JFrame: Verwaltet ein Fenstermit weitern graphischen Controls
■ Ein JFrame kann WindowEventsbearbeiten
WindowListener benötigt
Container
Behälter für andereKomponenten: add(…)
Behälter für andereKomponenten: add(…)
auf dem Desktop darstellbarauf dem Desktop darstellbar
Component
Object
JPanel
JApplet JFrame JDialog
Window
4 von 57School of Engineering © K. Rege, ZHAW
Applikationen mit GUIApplikationen mit GUI
■ Klasse MyFrame erbt von JFrame
■ Erzeuge Instanz von MyFrame
■ Öffne MyFrame with setVisible(true)
■ Add a Window Listener in Construktor
■ Beenden der Application mit
System.exit(0)
import java.awt.*;
import java.awt.event.*;
public class MyFrame extends JFrame {
public static void main(String[] args) {
// Create application frame.
MyFrame frame = new MyFrame("TestJFC");
// Show frame
frame.setSize(new Dimension(400, 400));
frame.setVisible(true);
}
public MyFrame(String name) {
super(name);
this.addWindowListener (
new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
}
Anonyme KlasseAnonyme Klasse
5 von 57School of Engineering © K. Rege, ZHAW
JFrameJFrame
Konstruktoren:
■ JFrame() erzeugt ein Fenster ohne Titel
■ JFrame(String Fenstertitel) erzeugt ein Fenster mit Titel
Wichtige Methoden (zum Teil von Klasse Window geerbt):
■ setSize(int b,int h) setzt Fenstergrösse
■ show() macht Fenster sichtbar
■ setVisible(boolean b) macht Fenster un-/sichtbar
■ toBack() schiebt Fenster nach hinten
■ toFront() schiebt Fenster nach vorne
■ validate(); ordnet Elemente in Fenster neu an
■ setTitle(String titel) setzt Fenstertitel (kann auch in
Contructor gemacht werden)
■ setMenuBar(MenuBar m) setzt neue Menuleiste des Fensters
6 von 57School of Engineering © K. Rege, ZHAW
WindowEventsWindowEvents
Ein JFrame kann WindowEvents verarbeiten; die Applikation muss WindowListener
Interface implementieren um darauf reagieren zu können:
■ public void windowOpened(WindowEvent event)wird aufgerufen, nachdem das Fenster das
erste Mal sichtbar geworden ist
■ public void windowClosing(WindowEvent event)wird aufgerufen, wenn der Benützer das
Fenster schliessen möchte
■ public void windowClosed(WindowEvent event)wird aufgerufen, sobald Fenster effektiv
geschlossen ist
■ public void windowIconified(WindowEvent event)wird aufgerufen, nachdem das Fenster
zu einem Icon verkleinert worden ist
■ public void windowDeiconified(WindowEvent event)wird aufgerufen, sobald der
Benützer das Icon wieder geöffnet hat
■ public void windowActivated(WindowEvent event)wird aufgerufen, sobald das Fenster
aktiv ist, d.h. den Fokus erhält
■ public void windowDeactivated(WindowEvent event)wird aufgerufen, sobald Fenster
inaktiv geworden ist, d.h. den Fokus abgegeben hat
7 von 57School of Engineering © K. Rege, ZHAW
PlayBalloon PlayBalloon ApplikationApplikation
import java.awt.*; import java.awt.event.*;public class PlayBalloon extends JFrame implements ActionListener,WindowListener {
private Button grow, shrink; private Balloon myBalloon;
public static void main(String[] args) { PlayBalloon f = new PlayBalloon();
f.setSize(300,300); f.setVisible(true); } public PlayBalloon() { // Constructor kreiert u.a. GUI setTitle("Balloon"); setLayout(new FlowLayout()); // Default Layout for JFrame = Border! grow = new Button("Grow"); add(grow); grow.addActionListener(this); shrink = new Button("Shrink"); add(shrink); shrink.addActionListener(this); myBalloon = new Balloon(20, 50, 50); this.addWindowListener(this); }
8 von 57School of Engineering © K. Rege, ZHAW
PlayBalloon PlayBalloon ApplikationApplikation
public void actionPerformed (ActionEvent event) { // wie beim Applet if (event.getSource() == grow){ myBalloon.changeSize(10); } if (event.getSource() == shrink){ myBalloon.changeSize(-10); } repaint(); } public void windowClosing(WindowEvent event) { // WindowListener !! System.exit(0); } public void windowIconified(WindowEvent event) { } public void windowOpened(WindowEvent event) { } public void windowClosed(WindowEvent event) { }
public void windowActivated(WindowEvent event) { } public void windowDeiconified(WindowEvent event) { } public void windowDeactivated(WindowEvent event) { }
public void paint (Graphics g) { // gleich wie beim Applet myBalloon.display(g); }}
Adapter verwenden!Adapter verwenden!
9 von 57School of Engineering © K. Rege, ZHAW
JFC/SwingKomponenten
10 von 57School of Engineering © K. Rege, ZHAW
JFC Klassenhierarchie (vereinfacht)
Component
JPanel
JApplet
JScrollbarJButton
JTextField
JFrame
JRadioButtonJCheckBox
JTextArea
FlowLayout
BoxLayoutBorderLayout
einfache JFCKomponenten
gemeinsame Oberklasse(auch für AWT)
gemeinsame Oberklasse(auch für AWT)
auf dem Desktopdarstellbare Behälter
Hilfsklassen zurAnordnungssteuerung
JDialog
JTextComponent
Object
Container
JComponentWindow
JLabel
Oberklasse für eigene JFCKomponenten (kein Canvas mehr)
Oberklasse für eigene JFCKomponenten (kein Canvas mehr)
"Behälter" für andereKomponenten
"Behälter" für andereKomponenten
JMenu
11 von 57School of Engineering © K. Rege, ZHAW
JTextField, JTextArea undJLabel
12 von 57School of Engineering © K. Rege, ZHAW
Textkomponenten Oberklasse:JTextComponent
■ ist abstrakte Oberklasse der Klassen JTextField und JTextArea:JTextComponent definiert verschiedene Methoden, die von JTextFieldund JTextArea geerbt werden:
■ setEditable(boolean b) macht die Textkomponente editierbar oder nicht, jenach Wert von b
■ boolean isEditable() gibt zurück, ob Textkomponente editierbar ist
■ String getText() liest den ganzen Text aus dem Textfeld ausZeilenende ist jeweils mit "\n" markiert
■ setText(String Text) setzt Text in das Textfeld. Zeilenumbrüche mit "\n" markieren.
■ int getSelectionStart() gibt Startindex des selektierten Textes zurück
■ int getSelectionEnd() gibt EndIndex des selektierten Textes zurück
■ String getSelectedText() gibt den selektierten Text selbst zurück
■ select(int startidx ,int endidx) selektiert Text zwischen startidx und endidx
■ selectAll() selektiert gesamten Text im Textfeld
■ addTextListener(Object lis) registriert ein Objekt als TextListener bei derTextkomponente. Das Listenerobjekt wird informiert, sobald sich der Text in der Textkomponente geändert hat. Der TextListenermuss dazu die Methode public void textValueChanged(TextEvent e) deklarieren.
13 von 57School of Engineering © K. Rege, ZHAW
JTextField und JTextArea
■ Klassen JTextField und JTextArea sind Unterklassen der KlasseJTextComponent
■ Bei JTextField nur eine Zeile eingebbar.
■ Bei JTextArea Eingabe beliebiger Anzahl Zeilen möglich■ JTextArea hat 2 Scrollbars
■ Deklaration eines Textfeldes (3 Möglichkeiten):■ JTextArea t = new JTextArea();
■ JTextArea t = new JTextArea("1. Zeile\n2.Zeile");
■ erzeugt ein Textfeld mit den 2 Zeilen.■ JTextArea t = new JTextArea(anzReihen, anzKolonnen);
■ Nützliche Methoden (zusätzlich zu denen, die in Klasse JTextComponent
definiert sind):■ insert(String text, int idx) fügt text an der Stelle idx ins Textfeld ein■ replaceRange(String text, int startindex, int endindex)
■ ersetzt Text zwischen startindex und endindex des Textfeldes durch text■ append(String text) hängt text am Ende des Textfeldes an
14 von 57School of Engineering © K. Rege, ZHAW
Textzeile (JTextField)
■ JTextField ist für einzeilige Eingaben (und Ausgaben) gedacht
■ Der eingegebene Text kann beliebig editiert werden, bis die Eingabe durch
Drücken der Enter-Taste bestätigt wird
■ Löst ActionEvents aus
■ Anwendungsbeispiel:
15 von 57School of Engineering © K. Rege, ZHAW
Textzeile erzeugen
■ JFrame als ActionListener deklarieren.
■ JTextField-Variable deklarieren: JTextField eingabe;
■ Textzeile erzeugen: eingabe = new JTextField(10);■ 10 bedeutet die maximale Anzahl angezeigter Zeichen
■ Textzeile zu JFrame hinzufügen: add(eingabe);
■ JFrame als Listener registrieren: eingabe.addActionListener(this);
■ Methode actionPerformed schreiben.
■ Um den Text in der Textzeile zu verarbeiten, stellt die Komponente
verschiedene Methoden zur Verfügung:■ Text von der Textzeile einlesen: eingabe.getText()■ Text in Textzeile schreiben: eingabe.setText("Text")
16 von 57School of Engineering © K. Rege, ZHAW
…JTextField: Demo-Applikation
import java.JFrame.*;import java.awt.*;import java.awt.event.*;public class Textfeld_Waehlerkontrolle extends JFrame implements ActionListener { private JTextField eingabe; // Instanzvariablen: GUI-Objekt(Komponente) JTextField private int alter; // alter: ermöglicht Datenaustausch zw. 2 Methoden
public void initComponents() { // Aufbau GUI eingabe = new JTextField(10); // Komponente instanzieren getContenPane().add(eingabe); // zur GUI addieren eingabe.addActionListener(this); // Ereignis-Listener addieren }
public void actionPerformed(ActionEvent event) { if (event.getSource() == eingabe){ alter = Integer.parseInt(eingabe.getText()); // Textfeld auslesen und wandeln } repaint(); }
public void paint (Graphics g) { g.drawString("Alter ist " + alter, 50, 80); if (alter >= 18){ g.drawString("Stimmberechtigt", 50, 100); } else { g.drawString("Zu jung!", 50,100); } }
}
17 von 57School of Engineering © K. Rege, ZHAW
JLabel
■ JLabels sind Beschriftungen mit einem fixen Text■ Erbt nicht von JTextComponent
■ Ein JLabel-Objekt kann mit folgender Anweisung erzeugt werden (als lokale
Variable):
JLabel JLabelVariable = new JLabel("JLabeltext");
■ JLabeltext ist der Text der Beschriftung
■ JLabels verhalten sich wie andere Komponenten (Scrollbar, JButton, etc.)
■ JLabel erzeugen keine Ereignisse!
18 von 57School of Engineering © K. Rege, ZHAW
Auswahl weiterer Komponenten
19 von 57School of Engineering © K. Rege, ZHAW
Ein oder mehrfache Auswahl: JCheckBox
■ ermöglicht (mehrfache) Auswahl aus einer (Check-)Liste.
■ Eine JCheckBox hat einen Zustand -> ausgewählt oder nicht
■ Erzeugung (Instanzierung):■ JCheckBox one = new JCheckBox ("one");
erzeugt eine JCheckBox mit Label "Cola"■ JCheckBox two = new JCheckBox ("two",true);
■ erzeugt gleiche JCheckBox wie oben, die aber bereits ausgewählt ist
■ Hinzufügen■ Listener registrieren: one.addItemListener(this);
■ Behandlung der Events:■ muss ItemListener sein■ muss Methode public void itemStateChanged(ItemEvent e) zur Verfügung stellen
■ Nützliche Methoden von JRadioButton-Objekten:■ String getText() gibt Label der JCheckBox zurück■ boolean isSelected() Zustand der JCheckBox (selektiert oder nicht)■ setText(String str) Setzt Label einer JCheckBox auf str■ setSelected(boolean sel) Selektiert oder deselektiert
20 von 57School of Engineering © K. Rege, ZHAW
RadioButton: JRadioButton
■ Es kann maximal ein Schalter einer
Schaltergruppe eingeschaltet sein
■ Instanzierung:one = new JRadioButton("one");
two = new JRadioButton("two");
ButtonGroup group = new ButtonGroup();
group.add(one);
grous.add(two);
■ Erzeugt eine Schaltergruppe c undeinen Schalter red mit dem Label "one",
der eingeschaltet ist.
■ ButtonGroup wird nur bei Deklaration
gebraucht
21 von 57School of Engineering © K. Rege, ZHAW
Auswahl: JComboBox
■ Liste von Auswahlmöglichkeiten, von denen man eine auswählen kann.
■ Erzeugung:■ JComboBox colourChoice = new JComboBox();
■ Hinzufügen:colourChoice.addItem("Rot");
colourChoice.addItem("Grün");
■ Behandlung der Events:■ Applet muss ActionListener sein■ Methoden des ActionEvent-Objekts:
Object getSource() gibt JComboxBox zurück, die Ereignis erzeugteObject getSelectedItem() gibt Item (als String) zurück, das Ereignis erzeugte
■ Bsp:if (e.getSource() == colorChoice) {
String aChoice = (String)e.getSelectedItem();
}
■ -> aChoice enthält schliesslich den String des angewählten Items
22 von 57School of Engineering © K. Rege, ZHAW
Menus
23 von 57School of Engineering © K. Rege, ZHAW
Menus
■ Applikationen können im Gegensatz zu
Applets neben den anderen GUI-
Komponenten auch Menus enthalten
■ Dazu braucht es eine sogenannteMenuleiste (JMenubar) an dieser Leiste
sind die Menus aufgehängt sind
■ MenuItem: so heissen die einzelnen
Einträge eines Menus (können selbstwieder Untermenus sein)
■ Klassenhierarchie:
JComponent
JMenuItem JMenuBar
JMenu
24 von 57School of Engineering © K. Rege, ZHAW
Menus
■ JMenuBar: Leiste, an der die Menus aufgehängt sind
■ JMenu einzelne Einträge in Menübar
■ JMenuItem: einzelne Einträge eines Menus
■ Klassen:■ JMenuBar■ JMenu■ JMenuItem
25 von 57School of Engineering © K. Rege, ZHAW
Klasse JMenuBar
■ Konstruktor■ JMenuBar()
■ Nützliche Methoden■ add(JMenu menu)
■ Werden mittels der JFrame-MethodesetMenuBar(JMenuBar menuleiste)
zu einem JFrame hinzugefügt
26 von 57School of Engineering © K. Rege, ZHAW
Klasse Klasse JMenuJMenu
■ Klasse JMenu ist eine Unterklasse von JMenuItem:
■ Konstruktor: JMenu(String label) erzeugt JMenu mit Titel label
Nützliche Methoden
■ JMenuItem add(JMenuItem item) fügt JMenuItem item zum
JMenu
■ add(String label) erzeugt JMenuItem label und fügt es ans Ende des Menus an
(MenuItem wird zurückgegeben)
■ addSeparator() fügt einen Separator ans JMenu an
■ insert(JMenuItem item, int pos) fügt Item item an der Stelle pos ins JMenu ein
■ insertSeparator(int pos) fügt Separator an der Stelle pos ein
27 von 57School of Engineering © K. Rege, ZHAW
KlasseKlasse JMenuItem JMenuItem
■ erzeugt einen ActionEvent, falls das
betroffene JMenuItem ausgewählt wird
und aktiv ist
■ Es muss nicht bei jedem JMenuItem
ein ActionListener registriert sein■ Es kann auch nur ein Listener beim JMenu
selbst registriert sein■ Die ActionEvents eines Items werden dann
zum darüber liegenden JMenu propagiert
Konstruktoren:■ JMenuItem(String label) erzeugt ein
JMenu-Item label
■ JMenuItem(String label, MenuShortCut
shortcut) erzeugt ein JMenu-Item label mit
der zugeordneten Tastenkombination shortcut
28 von 57School of Engineering © K. Rege, ZHAW
JMenuItem JMenuItem MethodenMethoden
■ boolean isEnabled() gibt zurück, ob JMenu-Item aktiv ist
■ setEnabled(boolean b) aktiviert oder deaktiviert ein JMenu-Item
■ String getLabel() gibt Label des JMenu-Items zurück
■ setLabel(String name) setzt Label des JMenu-Items auf name
■ addActionListener(ActionListener o) registriert Object o als Listener
■ setActionCommand(String command) setzt Befehlsname des JMenu-Items auf
command (dieser kann aus dem ActionEvent-Objekt mit getActionCommand()
ausgelesen werden)
■ MenuShortcut getShortcut() gibt Shortcut des JMenu-Items zurück
■ setShortcut(MenuShortcut c) setzt Shortcut des JMenu-Items auf c
29 von 57School of Engineering © K. Rege, ZHAW
MenusMenus Verwendung Verwendung
JFrame
JMenuBar
JMenu
JMenu
JMenu
JMenuItem
JMenuItem
JMenuItem
JMenuItem
setMenuBar()
menubar.add()
moveMenu.add()
30 von 57School of Engineering © K. Rege, ZHAW
Menus EventMenus Event-Behandlung-Behandlung
JFrame
JMenuBar
JMenu
JMenu
JMenu
JMenuItem
JMenuItem
JMenuItem
JMenuItem
rightItem.addActionListener()
Diese Objekte erzeugen keine JMenu-Events
31 von 57School of Engineering © K. Rege, ZHAW
7 Schritte, um eine Menuleiste zu erzeugen:
■ 1. Neue Menuleiste erzeugen: JMenuBar menuBar = new JMenuBar();
■ 2. Neues JMenu erzeugen:JMenu menuName = new JMenu( menuTitel);
■ 3. Neuen Menueintrag erzeugen und ins JMenu einfügen:■ JMenuItem einItem = new JMenuItem(itemName); menuName.add(einItem);
■ Objekt als Listener des entsprechenden JMenu-Item-Events anmelden:einItem.addActionListener(this);
■ 4. Schritt 3 für alle JMenuItems wiederholen
■ 5. JMenu zu Menuleiste hinzufügen: menuBar.add(menuName);
■ 6. Schritte 2–4 für alle Menus wiederholen
■ 7. MenuLeiste in JFrame einfügen: setMenuBar(menuBar);
32 von 57School of Engineering © K. Rege, ZHAW
Beispiel:Beispiel: PlayBalloon PlayBalloon Applikation mit Applikation mit Menus Menus
■ Umwandlung der PlayBalloon Applikation: Menus statt Buttons
■ Code siehe Anhang
33 von 57School of Engineering © K. Rege, ZHAW
Und viele andere mehr ...
http://java.sun.com/docs/books/tutorial/uiswing/components/index.html
34 von 57School of Engineering © K. Rege, ZHAW
Dialoge
35 von 57School of Engineering © K. Rege, ZHAW
Dialoge: JDialog
■ Kleine Fenster für Meldungen und
Benutzer(nach)fragen
■ können modal zu anderem Window sein,
d.h. parent Window lässt keine Eingabezu solange JDialog sichtbar.
■ Konstruktoren:■ JDialog(JFrame Parent);
■ JDialog(JFrame parent, Stringtitle);
■ wichtige Methoden■ resize(int breite, int hoehe) setzt
Fenstergrösse■ show() macht JDialog sichtbar■ setVisible(boolean b) macht un-
/sichtbar■ setModal(boolean b)
setzt Modalität des Dialogs
class MyDialog extends JDialog implements
ActionListener {
JButton yes,no;
boolean _yes;
MyDialog (JFrame f,
String name) {
super(f, name);
resize(200,100);
setLayout (new FlowLayout());
yes = new Button("yes");
no = new Button("no");
yes.addActionListener(this);;
no.addActionListener(this);
this.setModal(true);
add(yes); add(no);
}
public boolean yesPressed() {return _yes};
public void actionPerformed
(ActionEvent e) {
_yes = e.getSource() == yes;
setVisible(false);
}
}
36 von 57School of Engineering © K. Rege, ZHAW
Standard Dialoge, z.B. JFileChooser
■ Weitere Einstellungsmöglichkeiten■ Filter, Directory, …
■ Standard DialogboxJOptionPane.showMessageDialog(frame,
"Eggs are not supposed to be green.",
"Inane error",JOptionPane.ERROR_MESSAGE);
■ erzeugt Dialog-Fenster, um ein File
auszuwählen
■ Deklaration:private JFileChooser fc;
■ Initialisierung:fc = new JFileChooser();
int returnVal = fc.showOpenDialog(this);
oderint returnVal = fc.showSaveDialog(this);
■ Verarbeitung:if (returnVal == JFileChooser.APPROVE_OPTION) {
….// ok
}
else {System.out.println("canceled");}
■ Name des ausgewählten Files:filename = fc.getSelectedFile().getName();
■ Pfad des ausgewählten Files:path = fc.getSelectedFile().getPath();
http://http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
37 von 57School of Engineering © K. Rege, ZHAW
Anordnungsverwalter
38 von 57School of Engineering © K. Rege, ZHAW
Anordnungsverwalter
■ Komponenten eines GUI werden i.d.R. nicht von Hand ausgerichtet, da
aufwendig und wenig flexibel
■ Swing definiert zu diesem Zweck verschiedene Layout-Manager die bestimmen,wie die Komponenten ausgelegt werden
■ Die JFrame/JPanel Methode validate ordnet die Komponenten entsprechend
an (nötig falls Komponenten zur Laufzeit hinzugefügt wurden)
■ Die wichtigsten Layout-Manager:■ FlowLayout: in der Mitte zentriert; Default für Applets■ BorderLayout: in 5 Regionen unterteilt■ GridLayout: GUI Kompontenten in Raster angeordnet■ GridBagLayout: Raster angeordnet mit Constraints
http://java.sun.com/docs/books/tutorial/uiswing/layout/index.html
39 von 57School of Engineering © K. Rege, ZHAW
Flussanordnung: FlowLayout
■ Default für Applets
■ Komponenten in einer Reihe von links
nach rechts zentriert zum Fenster,
■ Reihenfolge entspricht den add()-
Befehlen
■ Erzeugung:■ FlowLayout layout = new
FlowLayout();FlowLayout, Reihen zentriert
■ FlowLayout layout= newFlowLayout(FlowLayout.LEFT);FlowLayout, Reihen linksbündig
■ Layout setzen■ setLayout(layout);
public void init() {
setLayout(new FlowLayout());
add(new Button("Ok"));
add(new Button("Open"));
add(new Button("Close"));
}
40 von 57School of Engineering © K. Rege, ZHAW
Anordnung an den Rändern: BorderLayout
■ Default bei eigenständigen
Anwendungen
■ Komponenten entlang der Fensterseiten■ teilt das Fenster in 5 Felder ein: North, South,
East, West, Center
■ Nur eine Komponente pro Feld möglich■ Randfelder werden zuerst angelegt. Feld Center
belegt sodann den verbleibenden Platz
■ So füllen z.B. Schieberegler immer
ganze Seitelänge aus
■ Erzeugung■ BorderLayout layout = new
BorderLayout();Borderlayout ohne Zwischenräume zwischenden Komponenten
■ BorderLayout layout = newBorderLayout(10,20); Borderlayout mit10 Pixel horizontaler und 20 Pixel vertikalerZwischenraum zwischen den Komponenten
■ Layout setzen:■ setLayout(layout); oder direkt■ setLayout(new BorderLayout());
public void init() {
setLayout(new BorderLayout());
add(BorderLayout.NORTH,newButton("North"));
add(BorderLayout.SOUTH,newButton("South"));
add(BorderLayout.WEST,newButton("West"));
add(BorderLayout.EAST,newButton("East"));
add(BorderLayout.CENTER,newButton("Center"));
}
41 von 57School of Engineering © K. Rege, ZHAW
MatrixAnordnung: GridLayout
■ Komponenten Reihen- und
Kolonnenweise anordnen
■ Reihenfolge entspricht den add()-
Befehlen (Leserichtung l.r.o.u)
■ Erzeugung:■ GridLayout layout = new
GridLayout(int rows, int cols);rows = -1 -> beliebige Anzahl Reihen
■ GridLayout layout = newGridLayout(int rows, int cols,int hgap, int vgap); wie oben abermit Abstand zwischen den Komponenten
■ Layout setzen■ setLayout(layout);
public void init() {
setLayout(new GridLayout(-1,2));
add(new Button("1"));
add(new Button("2"));
add(new Button("3"));
add(new Button("4"));
add(new Button("5"));
add(new Button("6"));
}
42 von 57School of Engineering © K. Rege, ZHAW
Behälter
43 von 57School of Engineering © K. Rege, ZHAW
Komponentenbehälter Basis: Container
■ Ist abstrakte Oberklasse aller Komponenten, die andere
Komponenten enthalten können (Bsp. JComponent, JPanel)
■ Container (und Unterklassen) können selber
in Container eingebettet sein
■ Die wichtigsten Methoden sind:■ setLayout(LayoutManager layout) setzt den Layout-Manager der
Komponente auf layout■ add(Component komponente) fügt die Komponente komponente zur
aktuellen Komponente hinzu■ remove(Component komponente) entfernt Komponente komponente von
aktueller Komponente■ validate() Führt einen neuen Layout aus unter
Verwendung des aktuellen Layout-Managers (nötig, nachdem einzelneKomponenten unsichtbar/sichtbar gemacht wurden)
Container
JPanel
44 von 57School of Engineering © K. Rege, ZHAW
Konkreter Behälter: JPanel
■ Komponente, die zur Gruppierung von anderen Komponenten dient
■ Komponenten innerhalb eines JPanels werden gemäss dem entsprechenden
Layout-Manager angeordnet■ ist eine Unterklasse der Klasse Container
■ Vorgehen, um Komponenten mit JPanel zu gruppieren:■ JPanel erzeugen■ Komponenten zu JPanel hinzufügen■ JPanel zu anderen Container hinzufügen
■ Erzeugung■ JPanel p1 = new JPanel(new BorderLayout()) erzeugt ein JPanel mit BorderLayout-Manager■ JPanel p2 = new JPanel(new FlowLayout(FlowLayout.RIGHT)) erzeugt JPanel mit LayoutManager
■ Komponenten zu JPanel hinzufügen■ button b1 = new Button("button 1");
■ button b2 = new Button("button 2");
■ p2.add(b1);
■ p2.add(b2);
■ p1.add(BorderLayout.SOUTH,p2);
45 von 57School of Engineering © K. Rege, ZHAW
Übung
■ Erstellen sie mit den bekannten Anordnungsverwaltern und Elementen (inkl.
JPanel) ein GUI, das wie untenstehendes Beispiel aussieht.
46 von 57School of Engineering © K. Rege, ZHAW
Look and Feel
Nimbus 2000Nimbus 2000
47 von 57School of Engineering © K. Rege, ZHAW
Look Look and and FeelFeel
■ Plattform unabhängig■ Die Anwendung soll unabhängig von der Plattform gleich aussehen
try {UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");}
catch (Exception e) {System.out.println("L&F not found");}
■ Plattform abhängig■ Die Anwendung soll sich wie eine "native" Anwendung auf der entsprechenden Plattform aussehen.
try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception e) {System.out.println("L&F not found");}
■ Einstellung in main()■ noch bevor das erste Fenster geöffnet wird
48 von 57School of Engineering © K. Rege, ZHAW
Plattformunabhänge Look and Feel
■ Plattformunabhänge Look and Feels
■ Metal (Default) and Nimbus Look and Feel
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel""javax.swing.plaf.metal.MetalLookAndFeel"
49 von 57School of Engineering © K. Rege, ZHAW
Nativer Look And Feel
■ Angepasst an jeweilige Plattform■ XP, Win 7, Win 10, Mac
50 von 57School of Engineering © K. Rege, ZHAW
Spezielle Look and Feel
■ Verschiedene spezielle Look and Feel■ Napkin für Prototypen
http://javootoo.com/plaf/napkin/index.html"napkin.NapkinLookAndFeel"
51 von 57School of Engineering © K. Rege, ZHAW
Zusammenfassung
■ Anwendungen mit GUI■ JFC/Swing
■ JMenu
■ Weitere Komponenten■ Layouts
■ Look & Feel
52 von 57School of Engineering © K. Rege, ZHAW
Noch Fragen?
53 von 57School of Engineering © K. Rege, ZHAW
Anhang: JFC Klassenbibliothek
54 von 57School of Engineering © K. Rege, ZHAW
… JFC Klassenbibliothek
55 von 57School of Engineering © K. Rege, ZHAW
Anhang:Anhang: PlayBalloon PlayBalloon Applikation mit Applikation mit Menus Menus
public class MenuBalloon extends JFrameimplements ActionListener,WindowListener {
private Balloon myBalloon;
private JMenuItem growItem, shrinkItem;
private JMenuItem leftItem, rightItem;
public static void main(String[] args){
MenuBalloon f = new MenuBalloon();
f.setSize(300,300);
f.setVisible(true);
}
public MenuBalloon() {
setTitle("Balloon");
setLayout(new FlowLayout());
JMenuBar menuBar = new JMenuBar();
JMenu sizeMenu = new JMenu("Size");
growItem = new JMenuItem("Grow");
sizeMenu.add(growItem);
growItem.addActionListener(this);
// …Fortsetzung Constructor
shrinkItem = new JMenuItem("Shrink"); sizeMenu.add(shrinkItem); shrinkItem.addActionListener(this); menuBar.add(sizeMenu);
JMenu moveMenu = new JMenu("Move"); leftItem = new JMenuItem("Left"); moveMenu.add(leftItem); leftItem.addActionListener(this); moveMenu.addSeparator(); rightItem = new JMenuItem("Right"); moveMenu.add(rightItem); rightItem.addActionListener(this);
menuBar.add(moveMenu);
setJMenuBar(menuBar);
myBalloon = new Balloon(20, 50, 50); this.addWindowListener(this); }
56 von 57School of Engineering © K. Rege, ZHAW
Anhang: ...Anhang: ...PlayBalloonPlayBalloon Applikation mit Applikation mit Menus Menus
public void actionPerformed (ActionEvent event) {
if (event.getSource() == growItem){
myBalloon.changeSize(10);
}
if (event.getSource() == shrinkItem){
myBalloon.changeSize(-10);
}
if (event.getSource() == leftItem){
myBalloon.moveLeft();
}
if (event.getSource() == rightItem){
myBalloon.moveRight();
}
repaint();
}
public void paint (Graphics g) {
myBalloon.display(g);
}
public void windowClosing(WindowEvent event) {….}
// ………… // windows listener Methoden
} // end class MenuBalloon
Public class Balloon { … gleich wie vorher … }
Menü-Elemente (Items)Menü-Elemente (Items)
57 von 57School of Engineering © K. Rege, ZHAW
Anhang: Anhang: Beenden von JFC AnwendungenBeenden von JFC Anwendungen
■ Reagieren auf Windows Event
■ Mittels WindowListener(wie AWT)
■ System.exit(0) bei Closing Event von
Fenster aufrufen
■ meist anonyme Klasse implementiert
this.addWindowListener (
new WindowAdapter() {
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
■ Mittels defaultClosingOperation
■ Eigenschaft des JFrames festlegen
■ frame.setDefaultCloseOperation(JFrame
.EXIT_ON_CLOSE)