Vorstellung
Ich bin Geschäftsführer der PartMaster GmbH und als Java-Architekt mit den Schwerpunkten Rich Client Platform, Data Binding und Modelling Framework in Software-Projekten tätig.
PartMaster GmbH
Lagerstraße 44/45
18055 Rostock
fon +49 381-20373995
fax +49 381-20373994
email info@partmaster.de
Nachdem wir im Teil 4 Beispiel-Unit-Test für den leichtgewichtigen Controller die Auswirkungen des Ansatzes für einen leichtgewichtigen Controller auf die Testbarkeit des Controllers untersucht haben, wollen wir uns in diesem Teil mit der Wiederverwendbarkeit des Controllers beschäftigen.
Wie versprochen ist der leichtgewichtige Controller einfach wiederverwendbar. Hier eine Swing-Implementierung der View, mit der der Controller unverändert zusammenarbeiten kann. Dabei wird die Erweiterung des Eclipse Data Binding für Swing aus dem Eclipse Incubations-Projekt UFaceKit (http://www.eclipse.org/ufacekit/) verwendet. Abbildung 4 zeigt die Sekundenzähler-Applikation mit Swing-GUI.

Abbildung 4: Sekundenzähler als Swing-Applikation
Listing 14 zeigt die Swing-Implementierung der View:
package de.partmaster.databinding.observable.ui.sample;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import org.eclipse.core.databinding.observable.value.IObservableValue;
import org.eclipse.ufacekit.ui.swing.databinding.swing.SwingEventConstants;
import org.eclipse.ufacekit.ui.swing.databinding.swing.SwingObservables;
@SuppressWarnings("serial")
public final class SwingClockView extends JPanel implements ObservableClockView {
final private IObservableValue timeTextObservable;
final private IObservableValue modeTextObservable;
final private IObservableValue timeEnabledObservable;
final private IObservableValue modeSelectionObservable;
public SwingClockView(JFrame frame) {
setLayout(new GridBagLayout());
JTextField timeWidget = new JTextField();
timeWidget.setHorizontalAlignment(JTextField.RIGHT);
GridBagConstraints timeWidgetConstraints = new GridBagConstraints();
timeWidgetConstraints.weightx = 100;
timeWidgetConstraints.fill = GridBagConstraints.HORIZONTAL;
add(timeWidget, timeWidgetConstraints);
JToggleButton modeWidget = new JToggleButton();
GridBagConstraints modeWidgetConstraints = new GridBagConstraints();
add(modeWidget, modeWidgetConstraints);
timeTextObservable = SwingObservables.observeText(timeWidget, SwingEventConstants.Modify);
timeEnabledObservable = SwingObservables.observeEnabled(timeWidget);
modeSelectionObservable = SwingObservables.observeSelection(modeWidget);
modeTextObservable = SwingObservables.observeText(modeWidget);
frame.getContentPane().add(this);
}
@Override
public IObservableValue getModeSelection() {
return modeSelectionObservable;
}
@Override
public IObservableValue getTimeText() {
return timeTextObservable;
}
@Override
public IObservableValue getModeText() {
return modeTextObservable;
}
@Override
public IObservableValue getTimeEnabled() {
return timeEnabledObservable;
}
}
Listing 14: Swing-Implementierung der View
Und hier die Klasse mit der main-Funktion für die Swing-Variante:
package de.partmaster.databinding.observable.ui.sample;
import javax.swing.JFrame;
import org.eclipse.ufacekit.ui.swing.databinding.swing.SwingObservables;
public class SwingClockMain {
public static void main(String[] args) {
JFrame frame = new JFrame();
ObservableClockView view = new SwingClockView(frame);
ClockBean bean = new ClockBean();
new ObservableClockController().bind(view, bean);
new ClockService(SwingObservables.getRealm(), bean).start();
frame.pack();
frame.setVisible(true);
}
}
Listing 15: Main-Funktion für die Swing-Variante
In den bisherigen Teilen dieser Serie wurde der Ansatz für einen leichtgewichtigen Controller vorgestellt und anhand eines Beispieles die einfache Testbarkeit und gute Wiederverwendbarkeit illustriert. Im Teil 6 Motivation für einen Convenience Layer wird dargestellt, was es eigentlich noch braucht, um den Ansatz in einem realen Projekt nutzen zu können.