Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt...

98
DESKTOP-MUSTER & DATENBINDUNG JGoodies Karsten Lentzsch

Transcript of Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt...

Page 1: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

DESKTOP-MUSTER & DATENBINDUNG

JGoodies Karsten Lentzsch

Page 2: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

JGoodies

Quelloffene Swing-Bibliotheken

Beispielanwendungen

Gestalte Oberflächen

Berate zu Desktop und Swing

In Expertengruppen zu JSRs 295 und 296

Eigene Bibliothek: JGoodies Binding

Page 3: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Wie organisiere ich Präsentationslogik?

Wie synchronisiere ich Fachdaten mit GUI?

Ziel

Page 4: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Gliederung

Einleitung

Autonomous View

Model View Controller

Model View Presenter

Presentation Model

Datenbindung

Page 5: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Gliederung

Einleitung

Autonomous View

Model View Controller

Model View Presenter

Presentation Model

Datenbindung

Page 6: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Fragen

Wie strukturiere ich meine Anwendung?

Wie baue ich einen View?

Wer handhabt Events?

Brauche ich einen Controller?

Wie kann ich meine GUI-Logik testen?

Page 7: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Legende

Domain Object

Presentation Logic

Presentation (View)

ReferenziertMeldet

Page 8: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Legende

Domain Object

Fach-/Geschäftslogik

Beispiele:

Buch

Person

Adresse

Rechnung

Allgemein: Graph

Page 9: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Legende

Presentation Logic

Handler für:

Listenauswahländerung

CheckBox-Auswahl

Drag-Drop-Ende

UI-Modelle:

ListModel

TableModel

TreeSelectionModel

Swing Actions

Page 10: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Event Handling vs. Presentation Logic

Toolkit handhabt feinkörnige Events:

Mouse entered, exited

Mouse pressed

RadioButton pressed, armed, rollover

Anwendung handhabt grobkörnige Events:

RadioButton selected

Action performed

Listenelement zugefügt

Facheigenschaft geändert

Page 11: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Legende

Presentation (View) Container

JPanel, JDialog, JFrame

Enthält:

JTextField, JList, JTable

Initialisierungscode

Panel-Baucode

GUI-Zustand:

CheckBox pressed

Mouse over

Page 12: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Legende

Rolle2

Rolle1 Die Rollen "sitzen"

in einer Klasse

Können aufeinanderzugreifen

Getrennte Schichten

Page 13: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Legende

A beobachtet Änderungen an B

A ist ein Observer

B ist ein Observable

A (Observer)

B (Observable)

ReferenziertMeldet

Page 14: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Alle Rollen vermengt

Domain

Presentation Logic

Presentation (View)

Page 15: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Muster: Separated Presentation

Domain

Presentation Logic

Presentation (View)

Page 16: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Fachlogik in der Präsentation

Business Logic

Presentation Logic

Presentation (View)

Domain

Page 17: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Entkopple Fachdaten und Präsentation

Fachdaten sollen die Präsentation nicht halten

Präsentation hält und ändert Fachdaten

Vorteile

verringert Komplexität

erleichtert mehrere Views

Page 18: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Separated Presentation mit Observer

Domain

Presentation Logic

Presentation (View)

ReferenziertMeldet

Page 19: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Separated Presentation (Beispiel)

Domain

Presentation Logic

Presentation (View)

ReferenziertMeldet

Page 20: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Visuelle Gliederung

Page 21: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Gliederung

Einleitung

Autonomous View

Model View Controller

Model View Presenter

Presentation Model

Datenbindung

Page 22: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Muster: Autonomous View

Presentation Logic

Presentation (View)

Page 23: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Autonomous View

Häufig eine Klasse pro Fenster/Screen

Häufig Unterklassen von JDialog, JFrame, JPanel

Enthält:

Felder für UI-Komponenten

Komponenten-Initialisierung

Panel-Bau und Layout

Modell-Initialisierung

Präsentationslogik: Listener, Operationen

Page 24: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Beispiel-GUI

Composer ist enabled, wenn Classical selected ist

Page 25: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Autonomous View-Beispiel I

public class AlbumDialog extends JDialog {

private final Album album;

private JTextField artistField;

...

public AlbumDialog(Album album) { ... }

private void initComponents() { ... }

private void initPresentationLogic() { ... }

private JComponent buildContent() { ... }

Page 26: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Autonomous View-Beispiel II

class ClassicalChangeHandler

implements ChangeListener {

public void stateChanged(ChangeEvent e) {

// Prüfe den classical-Zustand.

boolean classical = classicalBox.isSelected();

// Aktualisiere das composer-Feld-enablement.

composerField.setEnabled(classical);

}

}

Page 27: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Autonomous View: Tipps

Baue Dialoge, Frames, Panels

Erweitere JDialog, JFrame, JPanel wenn nötig. Erweiterst oder nutzt du HashMap?

Page 28: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Autonomous View

Üblich und brauchbar

Hat Nachteile:

Schwer logisch zu testen

Schwer zu überblicken, pflegen, debuggen, wenn der View oder die Logik komplex ist

Erwäge, die Logik vom View zu trennen

Page 29: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Präsentationslogik abgetrennt

Domain

Presentation LogicPresentation (View)

Page 30: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Separated Logic: Vorteile I

Logische Tests der Präsentationslogik

Team-Synchronisation

Kleinere Teile, leichter zu überblicken

Erleichtert "verbotene" Bereiche

für Entwickler

vor einem neuen Release

Layout-Änderungen erlaubt

Design fertig, Logik-Korrekturen erlaubt

Page 31: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Separated Logic: Vorteile II

Dünne, "dumme" GUI

einfacher zu bauen, verstehen, warten

kann syntaktischen Mustern folgen

Mehr Team-Mitglieder können damit arbeiten

Logik kann Präsentationsdetails ignorieren, etwa Kompontentypen (JTable vs. JList)

Logik kann geteilt werden zwischen Views

Page 32: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Separated Logic: Nachteile

Extra-Mechanismus für die Trennung

Mehraufwand um mehrere Quellen zu lesen und zu bearbeiten

Page 33: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Logik vom View trennen

Kann vereinfachen oder verkomplizieren

Trennkosten hängen vom Muster ab

Meinung: meistens lohnt es, zu trennen

Meine Empfehlung für Projekte:

Nutze Autonomous View für Nachrichtendialoge

Trenne alle anderen Fälle

Page 34: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Gliederung

Einleitung

Autonomous View

Model View Controller

Model View Presenter

Presentation Model

Datenbindung

Page 35: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Präsentationslogik abgetrennt

Domain

Presentation LogicPresentation (View)

Page 36: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Motivation für MVC

Domain

Presentation LogicPresentation (View)

Trennung 1

Trennung 2

Page 37: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Muster: Model-View-Controller

Model

ControllerView

meldetliest Daten ändert

Page 38: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Swing: M-JComponent-(VC)

UI Delegate

Control Behavior(Event Handling)

JComponentPainting

Component Model(s)

Page 39: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

JCheckBox

MetalCheckBoxUI

EventHandling

JCheckBox Painting

ToggleButtonModel

Change-Listener

BasicButtonUI

MouseListener

Basic Painting

MouseMotion

FocusListener

ChangeListener

PropertyChange

Page 40: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

MVC vs. Swing

MVC trennt View und Controller

Swing vereint View mit Controller

UI-Delegates malen und behandeln Events

MVC geht für Komponenten und Anwendungen

Swing nutzt MVC nicht für Komponenten

Page 41: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Gliederung

Einleitung

Autonomous View

Model View Controller

Model View Presenter

Presentation Model

Datenbindung

Page 42: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Muster: Model-View-Presenter

Model

PresenterView

Page 43: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Model-View-Presenter (MVP)

Model

•Hält Fachdaten•Bietet Geschäftslogik

Presenter

•Liest Fachdaten•Setzt GUI-Zustand•Präsentationslogik•Ändert Fachdaten

View

•UI-Komponenten•GUI-Zustand•Initialisierung•Baut Panel

Page 44: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Album mit Autonomous View

Album

AlbumDialog

JTextField

JTextField

JCheckBox

JTextFieldChangeHandler

Page 45: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Album mit MVP

Album

AlbumPresenterAlbumView

JTextField

JTextField

JCheckBox

JTextFieldChangeHandler

Page 46: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Von Autonomous View …

public class AlbumDialog extends JDialog {

private JTextField artistField;

public AlbumDialog(Album album) { ... }

private void initComponents() { ... }

private JComponent buildContent() { ... }

private final Album album;

private void initPresentationLogic() { ... }

private void readGUIStateFromDomain() { ... }

private void writeGUIStateToDomain() { ... }

class ClassicalChangeHandler implements ...

class OKActionHandler implements ...

}

Page 47: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

… zu Model-View-Presenter

class AlbumView extends JDialog {

JTextField artistField;

public AlbumView() { ... }

private void initComponents() { ... }

private JComponent buildContent() { ... }

}

public class AlbumPresenter {

private final AlbumView view;

private Album album;

private void initPresentationLogic() { ... }

private void readGUIStateFromDomain() { ... }

private void writeGUIStateToDomain() { ... }

class ClassicalChangeHandler implements ...

class OKActionHandler implements ...

}

Page 48: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

… zu Model-View-Presenter

class AlbumView extends JDialog {

JTextField artistField;

public AlbumView() { ... }

private void initComponents() { ... }

private JComponent buildContent() { ... }

}

public class AlbumPresenter {

private final AlbumView view;

private Album album;

private void initPresentationLogic() { ... }

private void readGUIStateFromDomain() { ... }

private void writeGUIStateToDomain() { ... }

class ClassicalChangeHandler implements ...

class OKActionHandler implements ...

}

Page 49: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Presenter: Beispiellogik

class ClassicalChangeHandler

implements ChangeListener {

public void stateChanged(ChangeEvent e) {

// Prüfe den classical-Zustand des Views.

boolean classical =

view.classicalBox.isSelected();

// Ändere dessen composer-Feld-Enablement.

view.composerField.setEnabled(classical);

}

}

Page 50: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Gliederung

Einleitung

Autonomous View

Model View Controller

Model View Presenter

Presentation Model

Datenbindung

Page 51: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Muster: Presentation Model

Domain

Presentation ModelViewViewView

Page 52: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Presentation Model (PM)

Domain

Presentation Model

•Liest Fachdaten•Relevanter Zustand•Präsentationslogik•Meldet Änderungen•Ändert Fachdaten

View

•UI-Komponenten•Voller GUI-Zustand•Initialisierung•Baut Panel•Handhabt PM-Events

Page 53: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Erinnerung: Swing-Actions

Action

•Relevanter Zustand•Meldet Änderungen

JButton

•Kompletter GUI-Zustand•Handhabt Action-Änderung

Page 54: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Von Autonomous View …

public class AlbumDialog extends JDialog {

private JTextField artistField;

public AlbumDialog(Album album) { ... }

private void initComponents() { ... }

private JComponent buildContent() { ... }

private final Album album;

private void initPresentationLogic() { ... }

private void readGUIStateFromDomain() { ... }

private void writeGUIStateToDomain() { ... }

class ClassicalChangeHandler implements ...

class OKActionHandler implements ...

}

Page 55: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

… zu Presentation Model

class AlbumView extends JDialog {

private final AlbumPresentationModel model;

private JTextField artistField;

public AlbumView(AlbumPM model) { ... }

private void initComponents() { ... }

private JComponent buildContent() { ... }

}

public class AlbumPresentationModel {

private Album album;

private void initPresentationLogic() { ... }

private void readPMStateFromDomain() { ... }

private void writePMStateToDomain() { ... }

class ClassicalChangeHandler implements ...

class OKActionHandler implements ...

}

Page 56: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Album mit Presentation Model

AlbumPMAlbumView

JTextField

JTextField

JCheckBox

JTextField

Text Model

Text Model

Selection Model

Text Model

Album

Page 57: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Album mit Presentation Model

AlbumPMAlbumView

JTextField

JTextField

JCheckBox

JTextField

Text Model

Text Model

Selection Model

Text Model

Album

Page 58: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

AlbumPresentationModel: Logik

Album

AlbumPMAlbumView

JTextField

JTextField

JCheckBox

JTextField

ChangeHandler

Text Model

Text Model

Selection Model

Text Model

Enablement ModelChangeHandler

Page 59: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

AlbumPresentationModel: Logik

Album

AlbumPMAlbumView

JTextField

JTextField

JCheckBox

JTextField

ChangeHandler

Text Model

Text Model

Selection Model

Text Model

Enablement ModelChangeHandler

Page 60: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

AlbumPresentationModel: Logik

Album

AlbumPMAlbumView

JTextField

JTextField

JCheckBox

JTextField

ChangeHandler

Text Model

Text Model

Selection Model

Text Model

Enablement ModelChangeHandler

Updates

Page 61: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

AlbumPresentationModel: Logik

Album

AlbumPMAlbumView

JTextField

JTextField

JCheckBox

JTextField

ChangeHandler

Text Model

Text Model

Selection Model

Text Model

Enablement ModelChangeHandlerNotifies

Page 62: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

AlbumPresentationModel: Logik

Album

AlbumPMAlbumView

JTextField

JTextField

JCheckBox

JTextField

ChangeHandler

Text Model

Text Model

Selection Model

Text Model

Enablement ModelChangeHandler

Updates enablement

Page 63: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Keine Sorge: Nochmal Actions

Swing nutzt soetwas für Actions

Actions feuern PropertyChangeEvents

JButton beobachtet seine Action und aktualisiert seinen Zustand

Swing synchronisiert Action- mit GUI-Zustand

Wir schreiben nur: new JButton(anAction)

Page 64: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Action mit mehreren Views

Action•Text•Icon•Enablement•Mnemonic

JButton JButton JMenuItem

Page 65: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

PM: Mehrere Views

Presentation Model

Panel mit Liste und Button

JList

ListModel

JButton

Action

Domain

PopupMenu

JMenuItem

Page 66: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

PM: Mehrere Views

Presentation Model

Anzeigeliste

JList

ListModel Action

Domain

Tabelle mit Button

JTable JButton

TableModelAdapter

Page 67: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

View

kompletter GUI-Zustand

View

kompletter GUI-Zustand

MVP vs. PM: GUI-Zustand

PresenterView

kompletter GUI-Zustand

Presentation Model

relevanter GUI-Zustand

Views

kompletter GUI-Zustand

Synchronisation

Page 68: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

MVP vs. PM: GUI-Zustand

MVP

View hält den GUI-Zustand

Presenter hält keinen Zustand

GUI-Zustand wird nicht synchronisiert

Presentation Model

View hält kompletten GUI-Zustand

PM hält den relevanten GUI-Zustand

Muss PM-Zustand mit View-Zustand synchronisieren

Page 69: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Testen

MVP

Presenter-Test braucht View-Stub

View-Vorschau ohne Presenter

Presentation Model

PM-Test ohne View(s)

View-Vorschau braucht PM-Stub

Page 70: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

MVP vs. PM: Transformation

Einige Autonomous Views nutzen GUI-Details

Presenter kann "unsauberen" Code beibehalten

Auftrennung in MVP ist leichter

Umbau zu MVP kostet weniger

Auftrennung in PM erfordert Extraarbeit

Finde geeignete GUI-Zustandsabstraktionen

Schreibe Handler in den Views

Räume auf

Evtl. profitiert man vom Aufräumen

Page 71: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

MVP vs. PM: Allgemeines

Entwickler sind eher gewöhnt, direkt mit GUI-Zustand zu arbeiten

Presenter hängt ab von GUI-Komponententypen

MVP: mechanische Trennung

PM: gedankliche Trennung

MVP geht Probleme an, die viele mit einer alten Implementierung von PM hatten

Page 72: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Gliederung

Einleitung

Autonomous View

Model View Controller

Model View Presenter

Presentation Model

Datenbindung

Page 73: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Datenbindung

Synchronisiert zwei Datenquellen

In einer oder zwei Richtungen

Kann häufig Typen wandeln

Integriert optional eine (Vor-)Validierung

Page 74: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Beispiele

Action → JButton

TableModel ↔ JTable

Album.classical ↔ Classical JCheckBox

Album.classical → Composer JTextField.enabled

Database ↔ GUI-Formular

Web Service → JTable

Page 75: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Beispiel: GUI-Modell mit View

Presentation Model

View

JTableJButton

TableModelAction

Page 76: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Bsp.: UI- mit Fachzustand

View

JTextFieldJCheckBox

enabled=trueselected=true

Album

classical=true

Page 77: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Bsp.: Formularwerte mit DB

GUI Form

JTextField JCheckBox JFormattedTextField

Database

Page 78: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Nützliche Swing-Bindungen

Presentation Model

View

JList

ListModel

JTable JButton

TableModel Action

JTree

TreeModel

Page 79: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Low-Level-Modelle in Swing

Presentation Model

View

JTextField

Document

JCheckBox JFormattedTextField

ToggleButtonModel Document

Page 80: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Gesucht: Geeignete Modelle

Presentation Model

View

JTextField

Text Model

JCheckBox JFormattedTextField

Boolean Model Date Model

Page 81: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Gesucht: Synchronisationspfad

Presentation Model

View

JTextField

Text Model

JCheckBox JFormattedTextField

Boolean Model Date Model

Album

classical=trueartist=”John” released=05/16/06

Page 82: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

JGoodies Binding

Nutzt Swing-Bindungen für JList, JTable, JComboBox, JTree, JButton

Springt ein, wo geeignete Modelle fehlen JTextField, JCheckBox, …

Wandelt Bean-Eigenschaften in einheitliche Modelle (ValueModel)

Macht Kniffliges möglich

Macht Einfaches ein bisschen einfacher

Page 83: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

AlbumView: Init mit binden

private void initComponents() {

artistField = Factory.createTextField(

presentationModel.getModel(“artist”));

classicalBox = Factory.createCheckBox(

presentationModel.getModel(“classical”));

songList = Factory.createList(

presentationModel.getSongsAndSelection());

okButton = new JButton(

presentationModel.getOKAction());

}

Page 84: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

AlbumView: EnablementHandler

private void initPresentationLogic() {

// Synchronisiere das Feld-Enablement

// mit dem PresentationModel-Zustand.

PropertyConnector.connect(

presentationModel,

“composerEnabled”,

composerField,

“enabled”);

}

Page 85: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

JSR 295: Beans Binding

Synchronisiert eine Datenquelle mit einem Ziel, typischerweise zwei bound Bean-Eigenschaften

Soll Typwandlung und Validierung können

Erster Code ist vorhanden

JSR hat noch keinen Draft, inaktiv

Spec lead weg

Projekt tot, Abspaltung geplant

Page 86: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

JavaFX

Page 87: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

JGoodies Binding vs. JSR 295

Property-Pfade

Bindeobjekte vs. Expression language

Kombinieren der Bindeobjekte

Synchron zu einem Teilgraphen vs. teilweise synchron zu einem großen Graphen

Puffern

Verzögern

Page 88: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Kopieren …

Einfach zu verstehen

Geht fast immer

Einfach zu debuggen; alle Operationen explizit

Macht's schwer, Views zu synchronisieren

Erfordert Disziplin im Team

Eher für grobkörnige Updates

Führt zu immer gleichem Code-Bläh

Page 89: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

… vs. automatische Bindung

Feinkörnige Aktualisierungen

Erleichtert Synchronisation

Deutlich schwerer zu verstehen und zu debuggen

Mehraufwand beim Umbenennen und für Obfuscator

Page 90: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Kosten automatischer Bindung

Erhöht Lernkosten

Senkt Produktionskosten

Kann Änderungskosten erheblich senken

Page 91: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Zusammenfassung

Ausgangspunkt: Separated Presentation

Üblich und OK: Autonomous View

MVP arbeitet mit View-GUI-Zustand

PM kopiert Zustand und braucht Synchronisation

Swing unterstützt Presentation Model bereits

Page 92: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Ratschläge

Nutze Separated Presentation wenn möglich

Teile Autonomous Views wenn geeignet

Lies Fowlers "Organizing Presentation Logic"

Nutze automatische Datenbindung nur

wenn sie zuverlässig und flexibel ist

mindestens einer im Team sie beherrscht

Page 93: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Sonstiges

Event Bus

JSR 296 – Swing Application Framework

organisiert, vereinfacht, standardisiert

Ressourcen-Management

Action-Management

Hintergrundaufgaben

Page 94: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Weitere Informationen

Martin Fowler: Further P of EAA

google "Organizing Presentation Logic"

Scott Delap: Desktop Java Live

JGoodies-Artikel - www.jgoodies.com/articles

Swing Data Binding

JSR 296

Page 95: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Datenbindungssysteme

JFace Data Binding siehe auch UFaceKit

Beans Binding

BetterBeansBinding Fabrizio Giucis BeansBinding-Abspaltung

JGoodies Binding Tutorial enthält PM-Beispiele

Oracle ADF otn.oracle.com suche "JClient"

Page 96: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

Swing-Überlebenshilfe

Desktop-Muster

Datenbinding JSR 296

Erste Hilfe für Swing

Layout-Management

Meta-Design

Page 97: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

FRAGEN UND ANTWORTEN

Page 98: Desktop-Muster & Datenbindung - JDiskReport...Event Handling vs. Presentation Logic Toolkit handhabt feinkörnige Events: Mouse entered, exited Mouse pressed RadioButton pressed, armed,

DESKTOP-MUSTER & DATENBINDUNG

JGoodies Karsten Lentzsch