Kapitel 7: Ereignis-basierte Kommunikation

Werbung
Liste P: Programmieren mit Java
WS 2001/2002, Prof. Dr. V. Turau, FH Wiesbaden
Kapitel 7: Ereignis-basierte Kommunikation
Folie 125 : Grafische Oberflächen
Eine grafische Oberfläche besteht aus Komponenten. Es gibt
einfache Komponenten und
Behälterkomponenten (Container)
Jede Komponente wird durch eine Klasse aus den Paketen
javax.swing
java.awt
realisiert
Behälterkomponenten können andere Komponenten aufnehmen
Einfache Komponenten können nicht allein, sondern nur innerhalb eines Containers
dargestellt werden
Folie 126 : Top-level Container
Top-level Container
Spezielle Container
Applet
Interner
Frame
Dialog
Layered
Pane
Frame
Root
Pane
Folie 127 : Einfache Komponenten
Button
Combo Box
List
Menu
Slider
Textfeld
Folie 128 : Nicht-editierbare Komponenten
Label
Tooltip
Fortschrittsbalken
Folie 129 : Editierbare Komponenten
Dateidialog
Baum
Tabelle
Textfeld
Farbwähler
Folie 130 : Wichtige Methoden von allen Komponenten
Methode
Bedeutung
public void setForeground(Color c)
Setzt Vordergrundfarbe
public Color getForeground()
Gibt Vordergrundfarbe zurück
public void setBackground(Color c)
Setzt Hintergrundfarbe
public Color getBackground()
Gibt Hintergrundfarbe zurück
public void setVisible(boolean b)
Macht Komponente sichtbar/unsichtbar
public Container getParent()
Gibt den Container der Komponente zurück
public Dimension getPreferredSize()
Gibt die gewünschte Größe an
public void add(PopupMenu popup)
Fügt Popup-Menü hinzu
public void setEnabled(boolean b)
Aktiviert/Deaktiviert die Komponente
public void setCursor(Cursor cursor)
Setzt den Cursor der Anwendung
Folie 131 : Wichtige Methoden von allen Behälterkomponenten
Methode
Bedeutung
public Component add(Component comp)
Fügt Komponente ein
public void remove(Component comp)
Entfernt Komponente
public void setLayout(LayoutManager mgr)
Legt den Layout-Manager fest
Folie 132 : Wichtige Methoden der Behälterkomponente Frame
Methode
Bedeutung
public void dispose()
Die Behälterkomponente wird vernichtet
public void pack()
Erzeugt Layout und Darstellung
public void setTitle(String title)
Setzt den Titel
public void setIconImage(Image image)
Setzt das Icon der Anwendung
public void setResizable(boolean
resizable)
Größe der Komponente änderbar/nicht
änderbar
Folie 133 : Allgemeine Vorgehensweise mit AWT
import java.awt.*;
public class ListePFrame extends Frame {
public ListePFrame () {
//Allgemeine Eigenschaften des Frames festlegen
//Layout, Hintergrund-/Vodergrundfarbe, Titel
}
public Dimension getPreferredSize() {
//Größe festlegen
}
public void init() {
//Komponenten erzeugen und einfügen
}
public static void main(String[] a) {
ListePFrame lpf = new ListePFrame();
lpf.init();
lpf.setVisible(true);
lpf.pack();
}
}
Folie 134 : Beispiel mit AWT
import java.awt.*;
public class ListePFrame extends Frame {
public ListePFrame () {
setLayout(new FlowLayout());
setBackground(Color.black);
setTitle("ListePFrame");
}
public Dimension getPreferredSize() {
return new Dimension(250, 200);
}
public void init() {
Button b = new Button("Ende");
b.setBackground(Color.green);
add(b);
}
public static void main(String[] a) {
Wie oben
}
}
Folie 135 : Beispiel mit AWT
Folie 136 : Allgemeine Vorgehensweise mit Swing
import javax.swing.*;
import java.awt.*;
public class ListePFrame extends JFrame {
public ListePFrame () {
//Allgemeine Eigenschaften des Frames festlegen
//Layout, Hintergrund-/Vodergrundfarbe, Titel
}
public Dimension getPreferredSize() {
//Größe festlegen
}
public void init() {
//Komponenten erzeugen und einfügen
}
public static void main(String[] a) {
}
Folie 137 : Beispiel mit Swing
import javax.swing.*;
import java.awt.*;
Wie oben
}
public class ListePFrame extends JFrame {
private Container contentPane;
public ListePFrame () {
contentPane = getContentPane();
contentPane.setLayout(new FlowLayout());
contentPane.setBackground(Color.black);
setTitle("ListePFrame");
}
public Dimension getPreferredSize() {
return new Dimension(250, 200);
}
public void init() {
JButton b = new JButton("Ende");
b.setBackground(Color.green);
add(b);
}
public static void main(String[] a) {
Wie oben
}
}
Folie 138 : Event-basierte Kommunikation: Beispiel
Der eingebene Text soll durch das Betätigen des Buttons in Großbuchstaben umgewandelt
werden.
Wie können die Komponenten kommunizieren?
Folie 139 : Event-basierte Kommunikation: Beispiel
import javax.swing.*;
import java.awt.*;
public class KommunikationsFrame extends JFrame {
JTextField f1, f2;
Container contentPane;
public void init() {
JButton b = new JButton("Mache zu Großbuchstaben");
contentPane.add(b);
b.addActionListener(this);
f1 = new JTextField(30);
contentPane.add(f1);
f2 = new JTextField(30);
f2.setEditable(false);
contentPane.add(f2);
}
// Rest wie vorher
}
Folie 140 : Event-basierte Kommunikation
Bei grafischen Oberflächen erfolgt die Kommunikation zwischen Laufzeitumgebung
(Benutzeroberfläche) und Anwendungsprogramm durch das Versenden von Nachrichten
(Events)
Die Laufzeitumgebung versendet Nachrichten bei
Mausclicks
Bewegungen der Maus
Tastatureingaben
Schließen von Fenstern
...
Folie 141 : Event-basierte Kommunikation
Bei der Kommunikation mit Nachrichten gibt es zwei Teilnehmergruppen:
Ereignisquellen: Auslöser der Nachrichten
Ereignisempfänger: Sie empfangen Nachrichten und führen daraufhin Aktionen aus
Ereignisse (Nachrichten) werden durch Unterklassen von EventObject repräsentiert
Ereignisempfänger werden auch Listener genannt
Folie 142 : Event-basierte Kommunikation
Folie 143 : Ereignisempfänger
Will eine Klasse auf die Ereignisse einer Komponente reagieren, so muss sie
ein Listener-Interface implementieren und
sich bei einer Ereignisquelle registrieren.
Erzeugt die Ereignisquelle ein Ereignis, so werden alle registrierten Ereignisempfänger
automatisch benachrichtet
Die Benachrichtung bewirkt, dass eine Methode des Listener-Interfaces des
Ereignisempfängers aufgerufen wird
Folie 144 : Listener-Interfaces
Zur besseren Übersicht und aus Effizienzgründen wurden die Ereignisse in verschiedene
Gruppen aufgeteilt
Für jede Gruppe gibt es:
eine Ereignisklasse
ein Listener-Interface
Pro Ausprägung des Ereignisobjektes gibt es eine Methode in dem zugehörigen
Listener-Interface, diese wird bei dem Auftreten des Ereignisses aufgerufen
Folie 145 : Listener-Interfaces (Beispiel)
Wird ein Button gedrückt, so wird ein ActionEvent an alle registrierten Ereignisempfänger
verschickt
Von diesem Event gibt es nur eine Ausprägung, also enhält das zugehörige Listener-Inerface
auch nur eine Methode:
public interface ActionListener {
public void actionPerformed(ActionEvent e);
}
Wird ein Button gedrückt, so wird automatisch an alle registrierten Listener-Objekte die
Methode actionPerformed(e) geschickt, wobei e das aktuelle Ereignisobjekt ist
Folie 146 : Registrierung
Wie erfolgt die Registrierung eines Listeners?
Zur Registrierung stellt eine Ereignisquelle eine Registrationsmethode der Form:
public void addXXXListener(XXXListener l)
zur Verfügung. Hierbei zeigt XXX an, um welche Ereignisse es sich handelt
Beispiele (d.h. Möglichkeiten für XXX):
Action
Mouse
Window
Folie 147 : Beispiel
Der eingebene Text soll durch das Betätigen des Buttons in Großbuchstaben umgewandelt
werden
Teilnehmer:
Ereignisquelle: Ein Button
Ereignisempfänger: Die Klasse KommunikationsFrame
Ereignisart: Action-Events
Methode zur Registrierung: addActionListener
Aktion:
Text aus erstem Textfeld auslesen
Text in Großbuchstaben umwandeln
Text in zweites Textfeld schreiben
Folie 148 : Beispiel (Code)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class KommunikationsFrame extends JFrame
implements ActionListener {
JTextField f1, f2;
private Container contentPane;
public void actionPerformed(ActionEvent e) {
String text = f1.getText();
text = text.toUpperCase();
f2.setText(text);
}
//Rest wie vorher
Folie 149 : Erweiterung
Ein zusätzlicher Button so das Löschen der beiden Textfelder ermöglichen
Wie kann zwischen den beiden Buttons unterschieden werden?
Die Klasse EventObject vereinbart hierzu die Methode:
public Object getSource()
Sie gibt eine Referenz auf das ereignisauslösende Objekt zurück
Die Klasse ActionEvent vereinbart hierzu die Methode:
public String getActionCommand()
Sie gibt den Text des ereignisauslösenden Buttons zurück
Folie 150 : Beispiel 1 (Code)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class KommunikationsFrame extends JFrame
implements ActionListener {
JTextField f1, f2;
private Container contentPane;
private Button action, reset;
public void init() {
contentPane = contentPane;
action = new JButton("Mache zu Großbuchstaben");
contentPane.add(action);
action.addActionListener(this);
JButton reset = new JButton("Löschen");
contentPane.add(reset);
reset.addActionListener(this);
// wie vorher
}
Folie 151 : Beispiel 1 (Code)
public void actionPerformed(ActionEvent e) {
if (e.getSource() == reset) {
f1.setText("");
f2.setText("");
}
else
f2.setText(f1.getText().toUpperCase());
}
//Rest wie vorher
Damit die Methode actionPerformed auf die Referenzen der Buttons zugreifen kann,
müssen diese in privaten Instanzvariablen abgespeichert werden.
Folie 152 : Beispiel 2 (Code)
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class KommunikationsFrame extends JFrame
implements ActionListener {
JTextField f1, f2;
private Container contentPane;
private final String RESET = "Löschen";
//Text des Buttons in Konstanten abspeichern (Redundanz vermeiden!)
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals(RESET)) {
f1.setText("");
f2.setText("");
}
else
f2.setText(f1.getText().toUpperCase());
}
//Rest wie vorher
Folie 153 : Ereignisse und Ereignisquellen
Alle Unterklassen von Component können folgende Ereignisse auslösen:
ComponentEvent
ComponentListener
FocusEvent
FocusListener
KeyEvent
KeyListener
MouseEvent
MouseListener
MouseMotionListener
Folie 154 : Ereignisse und Ereignisquellen
Komponente
Listener
Actionlistener Changelistener Itemlistener Listselectionlistener Windowlistener
Button
Check Box
Combo Box
Dialog
Frame
List
JTable
JProgressBar
JMenuItem
JSlider
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
X
Folie 155 : Ereignisse und Ereignisquellen
Warum gibt es so viele verschiedene Listener-Interfaces?
Treten Ereignisse sehr häufig auf, so kann das Verschicken der Ereignissen die Performanz
belasten (Beispiel: Mausbewegungen)
Aus diesem Grund, werden Ereignisse nur dann verschickt, wenn sich ein Interessent
registriert hat.
Damit Anwender sich gezielt registrieren können, wurden die Ereignisse in Gruppen
aufgeteilt.
Folie 156 : Beispiel: Maus-Ereignisse
Maus-Ereignisse sind in zwei Gruppen aufgeteilt:
Ereignis
Methode
Interface
Maus gedrückt
mousePressed
MouseListener
Maus losgelassen
mouseReleased
MouseListener
Maus gedrückt und losgelassen
mouseClicked
MouseListener
Cursor bewegt sich in Komponente mouseEntered
MouseListener
Cursor verlässt Komponente
mouseExited
MouseListener
Maus wurde bewegt
mouseMoved
MouseMotionListener
Gedrückte Maus wurde bewegt
mouseDragged MouseMotionListener
Herunterladen