57
INE2 Java Applikationen, Swing/JFC Anwendungen mit GUI Swing/JFC Menus Weitere Komponenten Layouts Look & Feel

INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

INE2Java Applikationen, Swing/JFC

■ Anwendungen mit GUI

■ Swing/JFC■ Menus

■ Weitere Komponenten

■ Layouts■ Look & Feel

Page 2: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

2 von 57School of Engineering © K. Rege, ZHAW

Frames und WindowEvents

Page 3: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 4: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 5: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 6: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 7: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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); }

Page 8: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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!

Page 9: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

9 von 57School of Engineering © K. Rege, ZHAW

JFC/SwingKomponenten

Page 10: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 11: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

11 von 57School of Engineering © K. Rege, ZHAW

JTextField, JTextArea undJLabel

Page 12: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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.

Page 13: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 14: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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:

Page 15: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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")

Page 16: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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); } }

}

Page 17: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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!

Page 18: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

18 von 57School of Engineering © K. Rege, ZHAW

Auswahl weiterer Komponenten

Page 19: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 20: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 21: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 22: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

22 von 57School of Engineering © K. Rege, ZHAW

Menus

Page 23: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 24: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 25: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 26: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 27: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 28: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 29: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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()

Page 30: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 31: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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);

Page 32: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 33: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

33 von 57School of Engineering © K. Rege, ZHAW

Und viele andere mehr ...

http://java.sun.com/docs/books/tutorial/uiswing/components/index.html

Page 34: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

34 von 57School of Engineering © K. Rege, ZHAW

Dialoge

Page 35: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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);

}

}

Page 36: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 37: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

37 von 57School of Engineering © K. Rege, ZHAW

Anordnungsverwalter

Page 38: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 39: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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"));

}

Page 40: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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"));

}

Page 41: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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"));

}

Page 42: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

42 von 57School of Engineering © K. Rege, ZHAW

Behälter

Page 43: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 44: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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);

Page 45: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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.

Page 46: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

46 von 57School of Engineering © K. Rege, ZHAW

Look and Feel

Nimbus 2000Nimbus 2000

Page 47: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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

Page 48: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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"

Page 49: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

49 von 57School of Engineering © K. Rege, ZHAW

Nativer Look And Feel

■ Angepasst an jeweilige Plattform■ XP, Win 7, Win 10, Mac

Page 50: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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"

Page 51: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

51 von 57School of Engineering © K. Rege, ZHAW

Zusammenfassung

■ Anwendungen mit GUI■ JFC/Swing

■ JMenu

■ Weitere Komponenten■ Layouts

■ Look & Feel

Page 52: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

52 von 57School of Engineering © K. Rege, ZHAW

Noch Fragen?

Page 53: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

53 von 57School of Engineering © K. Rege, ZHAW

Anhang: JFC Klassenbibliothek

Page 54: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

54 von 57School of Engineering © K. Rege, ZHAW

… JFC Klassenbibliothek

Page 55: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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); }

Page 56: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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)

Page 57: INE2 Java Applikationen, Swing/JFCradar.zhaw.ch/~rege/ine2_fs16/applikationen.pdfeinfache JFC Komponenten gemeinsame Oberklasse (auch für AWT) gemeinsame Oberklasse (auch für AWT)

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)