Java - Fachbereich Informatik Hochschule Darmstadt

Werbung
5. Java Swing
Grundlagen der
Programmierung II (Java)
Prof. Dr. Bernhard Humm
Hochschule Darmstadt – University of Applied Sciences
Sommersemester 2006
Übersicht Grundlagen der Programmierung II
Einordnung in den Kontext der Vorlesung
Anwendungsentwicklung (Referenzarchitektur, Softwarekategorien)
Anwendungs-Komponenten (Anwendungskern)
Datenbankzugriff
Graphische Benutzeroberflächen (Swing, JSF)
Client- / Serverkommunikation (RMI)
Berechtigungsverwaltung
Application Server (EJB)
Erweiterte Konzepte (Reflection, Threads, Design Patterns, …)
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 2
Agenda
Agenda
GUIs
GUIs
Java Swing
GUI-Statik
GUI-Dynamik
Referenzen
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006.
9.5.2006
Seite 3
Grafische Benutzeroberflächen (GUIs)
Dialog stammt aus
ARRIBA 8.0 der RIB Software AG (www.rib.de)
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm.
Sommersemester 2006., 9.5.2006, Seite 4
Bausteine für das Dialoglayout (Bibliothek)
Kopfzeile
Datei
Bearbeiten
Teildialog
Ansicht
Spalte
Spalte
Spalte
Spalte
U
051111
000
051112
A
051115
001
051115
A
051115
001
051115
A
051115
001
051115
V
051117
000
051117
Hilfe
Reiter
Feld Wert
Button
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 5
Agenda
Agenda
GUIs
Java
Java Swing
Swing
GUI-Statik
GUI-Dynamik
Referenzen
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006.
9.5.2006
Seite 6
Java Swing
Java Swing
Java Swing: Bibliothek von
Bausteinen zur Erstellung von
GUIs in Java
Teil der JFC (Java Foundation
Classes
Basierend auf AWT (Abstract
Windowing Toolkit, dem ersten,
einfachen GUI-Framework in
Java
Portable, das heißt
betriebssystemunabhängige
GUIs
Unser Beispiel: Calculator
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 7
Agenda
Agenda
GUIs
Java Swing
GUI-Statik
GUI-Statik
GUI-Dynamik
Referenzen
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006.
9.5.2006
Seite 8
GUI-Statik
JFrame:
Ein leeres Fenster anlegen
javax.swing.*: Java Extensions
mit allen Swing-Klassen
package gui;
import javax.swing.JFrame;
JFrame: Fenster mit Rahmen und
Inhaltsbereich (anfangs leer)
public class CalculatorFrame extends JFrame {
JFrame wird initialisiert (damit
erst einmal noch nicht sichtbar)
public static void main(String[] args) {
CalculatorFrame calculatorFrame = null;
calculatorFrame = new CalculatorFrame ();
calculatorFrame.setVisible(true);
Mit frame.setTitle(“Calculator“)
kann der Fenstertitel gesetzt
werden (alternativ mit
Konstruktor)
}
public CalculatorFrame() {
super("Calculator");
}
Anzeigen: frame.setVisible(true);
}
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 9
GUI-Statik
Das Fenster füllen: statisches GUI-Layout
cd GUI elements
calculator:
JFrame
contentPane:
Container
calculatorPanel:
JPanel
operatorLabel:
JLabel
commandPanel:
JPanel
operatorTextField:
JTextField
quitButton:
JButton
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 10
GUI-Statik
Component Hierarchie
Component: Objekt mit graphischer
Repräsentation (AWT und Swing); kann
Events verschicken und empfangen,
Container: Behälter für andere
Components (Composite Pattern); kann
LayoutManager benutzen
JComponent: Basisklasse für alle SwingKomponenten; kann Look and Feel
setzen
JFrame, JDialog, JApplet: top-level
Swing-Container
JPanel: eingebetteter Swing-Container
JLabel, JTextField, JButton, …: SwingKomponenten
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 11
GUI-Statik
LayoutManager
Der LayoutManager ist für die Anordnung der Dialogelemente im
Fenster verantwortlich
Jeder LayoutManager verfolgt dabei eine eigene Strategie, Elemente
zu platzieren und in der Größe so anzupassen, dass sie aus seiner
Sicht optimal präsentiert werden
Standard-LayoutManager:
– FlowLayout
– GridLayout
– BorderLayout
– CardLayout
– GridBagLayout
Null-Layout: Handarbeit
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 12
GUI-Statik
FlowLayout
Das FlowLayout ordnet
Dialogelemente nebeneinander
in einer Zeile an
Wenn keine weiteren Elemente
in die Zeile passen, wird mit der
nächsten Zeile fortgefahren.
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 13
GUI-Statik
GridLayout
Das GridLayout ordnet die
Dialogelemente in einem
rechteckigen Gitter an, dessen
Zeilen- und Spaltenzahl beim
Erstellen des Layoutmanagers
angegeben wird
(Das GridBagLayout ist ein
komplexer Layoutmanager, der
die Fähigkeiten von GridLayout
erweitert und es ermöglicht, mit
Hilfe von Bedingungsobjekten
sehr komplexe Layouts zu
erzeugen)
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 14
GUI-Statik
BorderLayout
Das BorderLayout verteilt die
Dialogelemente nach Vorgabe
des Programms auf die vier
Randbereiche und den
Mittelbereich des Fensters:
– NORTH
calculatorPanel:
CENTER
– SOUTH
– WEST
– EAST
– CENTER
commandPanel:
SOUTH
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 15
GUI-Statik
Das statische GUI-Layout programmieren
Swing-Komponenten erzeugen
durch Instanziierung, zum
Beispiel new JLabel
private void layoutFrame() {
Container contentPane;
aLabel = new JLabel("a:");
aTextField = new JTextField();
calculatorPanel = new JPanel(new GridLayout(4, 2));
calculatorPanel.add(aLabel);
calculatorPanel.add(aTextField);
…
computeButton = new JButton("Compute");
commandPanel = new JPanel(new FlowLayout());
commandPanel.add(computeButton);
…
contentPane = this.getContentPane();
contentPane.setLayout(new BorderLayout());
contentPane.add(calculatorPanel,
BorderLayout.CENTER);
contentPane.add(commandPanel,
BorderLayout.SOUTH);
…
this.pack();
JPanels erzeugen durch
Instanziierung
Komponenten zu Containern
hinzufügen durch add
Beispiele für 3 LayoutManager
frame.pack() (aus
java.awt.Window): führt das
Layout durch und passt die
Fenstergröße an
}
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 16
Agenda
Agenda
GUIs
Java Swing
GUI-Statik
GUI-Dynamik
GUI-Dynamik
Referenzen
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006.
9.5.2006
Seite 17
GUI-Dynamik
Das Model View Controller (MVC) Muster
Muster zur Gestaltung grafischer
Benutzeroberflächen (aus
Smalltalk 80)
View: grafische Repräsentation,
kennt Controller und Model
View:
grafische
Repräsentation
Controller:
Ablaufsteuerung
Controller: Ablaufsteuerung,
kennt View und Model
Model: Anwendungsdaten und –
funktionen; kennt im Idealfall
weder Controller noch View;
meldet nur Änderungen
(Observer Pattern)
Model:
Anwendungsdaten und
funktionen
JFrame implementiert View
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 18
GUI-Dynamik
Delegation-based Event Handling
Kommunikation zwischen Betriebssystem und Anwendungsprogramm
erfolgt durch das Versenden von Nachrichten
Ereignisquellen (Event Sources) sind die Auslöser der Nachrichten
Ereignisempfängern (EventListeners) sind Objekte, die das zum
Ereignis passende Empfänger-Interface implementieren
Damit ein Ereignisempfänger die Nachrichten einer bestimmten
Ereignisquelle erhält, muss er sich bei dieser registrieren
Delegation Based Event Handling: Mechanismus in Swing (mächtiger,
aber auch komplexer als entsprechender Mechanismus in AWT)
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 19
GUI-Dynamik
Events (Ereignisse)
Klassenhierarchie für alle
Ereignistypen; Wurzel:
java.util.EventObject, Events für GUIProgrammierung in
java.awt.AWTEvent
Low-Level-Ereignisse
ComponentEvent: für den Transfer
von elementaren Nachrichten
zuständig, die von Fenstern oder
Dialogelementen stammen
Semantische Ereignisse
ActionEvent, AdjustmentEvent,
ItemEvent und TextEvent: nicht an
ein bestimmtes GUI-Element
gebunden, sondern übermitteln
höherwertige Ereignisse wie das
Ausführen eines Kommandos oder
die Änderung eines Zustands
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 20
GUI-Dynamik
Listener (Ereignisempfänger)
Damit ein Objekt Nachrichten
empfangen kann, muss es eine
Reihe von Methoden
implementieren, die von der
Nachrichtenquelle, bei der es
sich registriert hat, aufgerufen
werden können
Interfaces implementieren, die
aus java.util.EventListener
abgeleitet sind
Je Ereignisklasse gibt es ein
EventListener-Interface
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 21
GUI-Dynamik
Listener registrieren
Listener muss ein EventListener
Interface implementieren
Im Beispiel: Controller-Klasse
CalculatorController –
ActionListener
Variante anonyme innere
Klassen auch gebräuchlich
Ereignis-Auslöser: hier JButton
(ActionEvent)
Registrierung von
calculatorController bei
computeButton durch
addActionListener
import java.awt.event.*;
public class CalculatorController
implements ActionListener {
CalculatorFrame calculatorFrame;
…
}
private void layoutFrame() {
...
computeButton = new JButton("Compute");
computeButton.addActionListener(
getCalculatorController());
...
}
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 22
GUI-Dynamik
Auf Events reagieren
import java.awt.event.*;
ActionListener muss die Methode
actionPerformed(ActionEvent e)
implementieren
public class CalculatorController
implements ActionListener {
CalculatorFrame calculatorFrame;
Aufruf des Models, hier:
Calculator Klasse mit
Klassenmethode compute(a,
operator, b)
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("Compute")){
String a, operator, b, result;
a = calculatorFrame.getATextField().getText();
operator = calculatorFrame.getOperatorTextField().
getText();
b = calculatorFrame.getBTextField().getText();
result = Calculator.compute(a, operator, b);
calculatorFrame.getResultTextField().setText(result);
Parameter auslesen aus View,
hier: calculatorFrame.
getATextField().getText();
Ergebnis rückschreiben in View,
hier: calculatorFrame.
getResultTextField().
setText(result);
}…
}
}
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 23
GUI-Dynamik
Fenster schließen
frame.setVisible(false): schließt
die Anzeige eines Fensters; das
Fenster kann durch
setVisible(true) jederzeit wieder
geöffnet werden
import java.awt.event.*;
public class CalculatorController
implements ActionListener {
CalculatorFrame calculatorFrame;
frame.dispose(): schließt die
Anzeige des Fensters und räumt
alle Ressoucen auf. Das Fenster
kann nicht mehr geöffnet werden
System.exit(0): beendet das
Programm
public void actionPerformed(ActionEvent e) {
…
if (e.getActionCommand().equals("Quit")){
calculatorFrame.setVisible(false);
calculatorFrame.dispose();
System.exit(0);
}…
}
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 24
Agenda
Agenda
GUIs
Java Swing
GUI-Statik
GUI-Dynamik
Referenzen
Referenzen
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006.
9.5.2006
Seite 25
Referenzen
Zum Weiterlesen
Guido Krüger, Handbuch der Java-Programmierung, Kapitel 23 - 40
Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. Sommersemester 2006., 9.5.2006, Seite 26
Herunterladen