Thema dieser Dokumentation / Das FirstSpirit 5 Modul- / Komponenten-Modell / Beispiel: Implementierung einer Eingabekomponente / SwingGadgets und die Verwendung von Standard-Aspekten

SwingGadgets und die Verwendung von Standard-Aspekten

Alle SwingGadget-Implementierungen müssen SwingGadget implementieren und können, sofern sie das Bearbeiten und Speichern von Werten (EditorValues) ermöglichen, zusätzlich noch Editable und ValueHolder vom Typ T implementieren, wobei T immer der Daten-Container-Typ des zugehörigen EditorValue<T> (hier String) ist.

Listing: Beispiel SwingGadget – Einbinden des Basistyps SwingGadget

public class CustomTextareaSwingGadget implements SwingGadget {
...
}

Bzw.:

Listing: Beispiel SwingGadget – Einbinden der Aspekte ValueHolder und Editable

public class CustomTextareaSwingGadget
implements SwingGadget, ValueHolder<String>, Editable {
...
}

Stattdessen kann die SwingGadget-Implementierung auch durch die abstrakte Basis-Implementierung AbstractValueHoldingSwingGadget<T, F extends GomFormElement> erweitert werden, die diese und weitere grundlegende Funktionalität bereits zur Verfügung stellt.

Listing: Beispiel SwingGadget – Erweiterung mit der abstrakten Basisimplementierung

public class CustomTextareaSwingGadget
extends AbstractValueHoldingSwingGadget<String, GomCustomTextarea> {
...
}

Die SwingGadget-Implementierung stellt einen öffentlichen Konstruktor zur Erzeugung einer neuen visuellen Darstellung der Eingabekomponente (ehemals GuiEditor) zur Verfügung, der von der zugehörigen Factory aufgerufen wird:

Listing: Beispiel SwingGadget – Konstruktor

/**
* Example (MODDEV): Constructs a new CustomTextareaSwingGadget
* a new displayable text editor representation.
* @param context swing gadget context
*/
public CustomTextareaSwingGadget(
final SwingGadgetContext<GomCustomTextarea> context) {
super(context);
}

Die eigentliche Swing-Komponente, das heißt die visuelle Darstellung der Eingabekomponente wird innerhalb der Methode JComponent getComponent() aus dem Interface SwingComponentProvider implementiert. Die nachfolgende Implementierung liefert beispielsweise eine mehrzeilige Texteingabe-Komponente (JTextArea) mit variablen Scroll-Balken zurück:

Listing: Beispiel SwingGadget – Implementierung derTexteingabekomponente

/* SwingGadget ============================================================== */

public JComponent getComponent() {
if (_component == null) {
_jTextArea = new JTextArea(getForm().rows(), 20);
_jTextArea.getDocument().addDocumentListener(this);
_component = new JScrollPane(_jTextArea,
JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
}
return _component;
}

Eine SwingGadget-Implementierung kann ein ValueHolder<T> sein. Das bedeutet, die innerhalb der Eingabekomponente gesetzten Werte (EditorValues) werden persistent gespeichert (siehe Wertespeicherung (EditorValue, ValueEngineer)). Anders als in FirstSpirit 4 werden die EditorValues nicht mehr an die Implementierung der Eingabekomponente übergeben, sondern intern nur noch über den Aspekt ValueHolder<T> behandelt (siehe Aspekt: ValueHolder<T>). Das umliegende FirstSpirit-Gadget-Framework behandelt dann alle weiteren Funktionen, beispielsweise das Speichern des Wertes.

Listing: Beispiel SwingGadget - Implementierung des Aspekts ValueHolder

/* ValueHolder ========================================================== */

public String getValue() {
return _jTextArea.getText();
}

public void setValue(@Nullable final String value) {
final String currentValue = getValue();
if ( ! Objects.equal(currentValue, value)) {
_jTextArea.setText(value);
}
}

public boolean isEmpty() {
return StringUtil.isEmpty(getValue());
}

Über den Aspekt Editable können die Werte einer Eingabekomponente bearbeitet und geändert werden. Der Aspekt ist ebenfalls ein Bestandteil der abstrakten Basisimplementierung. Die Methode setEditable(boolean editable) sperrt oder entsperrt die Komponente zur Bearbeitung der Werte:

Listing: Beispiel SwingGadget - Implementierung des Aspekts Editable

/* Editable ================================================= */

public void setEditable(final boolean editable) {
_jTextArea.setEditable(editable);
}

© 2005 - 2024 Crownpeak Technology GmbH | Alle Rechte vorbehalten. | FirstSpirit 2024.5 | Datenschutz