Über Steffen Nowacki

Bild des Benutzers Steffen Nowacki

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

Wiederverwendbarkeit des leichtgewichtigen Controllers

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.

Die Swing-Applikation

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.

screenshot2.png
Abbildung 4: Sekundenzähler als Swing-Applikation

Die Swing-View

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

Die Swing-Main-Klasse

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

Fortsetzung folgt

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.