Java Swing Prof. Dr. Bernhard Humm Hochschule Darmstadt – University of Applied Sciences...
-
Upload
almeric-stormer -
Category
Documents
-
view
106 -
download
0
Transcript of Java Swing Prof. Dr. Bernhard Humm Hochschule Darmstadt – University of Applied Sciences...
Java Swing
Prof. Dr. Bernhard HummHochschule Darmstadt – University of Applied SciencesWintersemester 2006/2007
CNAMPraktikum Systementwicklung
GUIs
Java Swing
GUI-Statik
GUI-Dynamik
Referenzen
Seite 2Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07. 13.12.2006
GUIs
Agenda
Agenda
Seite 3Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
Grafische Benutzeroberflächen (GUIs)
Dialog stammt aus ARRIBA 8.0 der RIB Software AG (www.rib.de)
GUIs
Seite 4Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
Bausteine für das Dialoglayout (Bibliothek)
Kopfzeile
Datei Bearbeiten Ansicht Hilfe
WertFeld
Button
Teildialog Reiter
Spalte Spalte Spalte Spalte
U 051111 000 051112
A 051115 001 051115
A 051115 001 051115
A 051115 001 051115
V 051117 000 051117
GUIs
GUIs
Java Swing
GUI-Statik
GUI-Dynamik
Referenzen
Seite 5Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07. 13.12.2006
Java Swing
Agenda
Agenda
Seite 6Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
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
Java Swing
GUIs
Java Swing
GUI-Statik
GUI-Dynamik
Referenzen
Seite 7Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07. 13.12.2006
GUI-Statik
Agenda
Agenda
Seite 8Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
JFrame:Ein leeres Fenster anlegen
javax.swing.*: Java Extensions mit allen Swing-Klassen
JFrame: Fenster mit Rahmen und Inhaltsbereich (anfangs leer)
JFrame wird initialisiert (damit erst einmal noch nicht sichtbar)
Mit frame.setTitle(“Calculator“) kann der Fenstertitel gesetzt werden (alternativ mit Konstruktor)
Anzeigen: frame.setVisible(true);
package gui;
import javax.swing.JFrame;
public class CalculatorFrame extends JFrame {
public static void main(String[] args) { CalculatorFrame calculatorFrame = null;
calculatorFrame = new CalculatorFrame (); calculatorFrame.setVisible(true); }
public CalculatorFrame() { super("Calculator"); }}
GUI-Statik
Seite 9Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
Das Fenster füllen: statisches GUI-Layout
cd GUI elements
calculator:JFrame
contentPane:Container
calculatorPanel:JPanel
commandPanel:JPanel
operatorLabel:JLabel
operatorTextField:JTextField
quitButton:JButton
GUI-Statik
Seite 10Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
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 Swing-Komponenten; kann Look and Feel setzen
JFrame, JDialog, JApplet: top-level Swing-Container
JPanel: eingebetteter Swing-Container
JLabel, JTextField, JButton, …: Swing-Komponenten
GUI-Statik
Seite 11Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
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
GUI-Statik
Seite 12Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
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.
GUI-Statik
Seite 13Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
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)
GUI-Statik
Seite 14Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
BorderLayout
Das BorderLayout verteilt die Dialogelemente nach Vorgabe des Programms auf die vier Randbereiche und den Mittelbereich des Fensters:
– NORTH
– SOUTH
– WEST
– EAST
– CENTER commandPanel: SOUTH
calculatorPanel: CENTER
GUI-Statik
Seite 15Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
Das statische GUI-Layout programmieren
Swing-Komponenten erzeugen durch Instanziierung, zum Beispiel new JLabel
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
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(); }
GUI-Statik
GUIs
Java Swing
GUI-Statik
GUI-Dynamik
Referenzen
Seite 16Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07. 13.12.2006
GUI-Dynamik
Agenda
Agenda
Seite 17Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
Das Model View Controller (MVC) Muster
Muster zur Gestaltung grafischer Benutzeroberflächen (aus Smalltalk 80)
View: grafische Repräsentation, kennt Controller und Model
Controller: Ablaufsteuerung, kennt View und Model
Model: Anwendungsdaten und –funktionen; kennt im Idealfall weder Controller noch View; meldet nur Änderungen (Observer Pattern)
JFrame implementiert View
View:grafische
Repräsen-tation
Controller:Ablauf-
steuerung
Model:Anwendungs-
daten und funktionen
GUI-Dynamik
Seite 18Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
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)
GUI-Dynamik
Seite 19Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
Events (Ereignisse)
Klassenhierarchie für alle Ereignistypen; Wurzel: java.util.EventObject, Events für GUI-Programmierung 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
GUI-Dynamik
Seite 20Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
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
GUI-Dynamik
Seite 21Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
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
private void layoutFrame() { ... computeButton = new JButton("Compute"); computeButton.addActionListener( getCalculatorController()); ... }
import java.awt.event.*;
public class CalculatorController implements ActionListener { CalculatorFrame calculatorFrame;…}
GUI-Dynamik
Seite 22Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
Auf Events reagieren
ActionListener muss die Methode actionPerformed(ActionEvent e) implementieren
Aufruf des Models, hier: Calculator Klasse mit Klassenmethode compute(a, operator, b)
Parameter auslesen aus View, hier: calculatorFrame. getATextField().getText();
Ergebnis rückschreiben in View, hier: calculatorFrame. getResultTextField(). setText(result);
import java.awt.event.*;
public class CalculatorController implements ActionListener { CalculatorFrame calculatorFrame;
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); } … }}
GUI-Dynamik
Seite 23Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
Fenster schließen
frame.setVisible(false): schließt die Anzeige eines Fensters; das Fenster kann durch setVisible(true) jederzeit wieder geöffnet werden
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
import java.awt.event.*;
public class CalculatorController implements ActionListener { CalculatorFrame calculatorFrame;
public void actionPerformed(ActionEvent e) { … if (e.getActionCommand().equals("Quit")){ calculatorFrame.setVisible(false); calculatorFrame.dispose(); System.exit(0); } …}
GUI-Dynamik
GUIs
Java Swing
GUI-Statik
GUI-Dynamik
Referenzen
Seite 24Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07. 13.12.2006
Referenzen
Agenda
Agenda
Seite 25Hochschule Darmstadt – University of Applied Sciences. Fachbereich Informatik. Prof. Dr. Bernhard Humm. WS 06/07., 13.12.2006,
Zum Weiterlesen
Guido Krüger, Handbuch der Java-Programmierung, Kapitel 23 - 40
Referenzen