UI-Control für Datumseingaben

Die Swing-Technologie für Java, um Desktop-Anwendungen mit einer anspruchsvollen Oberfläche zu erzeugen, ist inzwischen von Oracle mittelfristig abgekündigt. JavaFX gilt jetzt als der Nachfolger (und ich habe gehört, ca. 100 Entwickler lässt Oracle daran arbeiten!). Lohnt es sich noch, sich mit Swing zu beschäftigen? Tatsächlich gibt es trotz bemerkenswerter Features in JavaFX noch mindestens eine UI-Komponente in Swing, die es bis jetzt leider nicht nach JavaFX hinein geschafft hat, nämlich die Klasse javax.swing.JFormattedTextField. Das ist sehr schade, handelt es sich doch um eine sehr mächtige Texteingabekomponente mit anspruchsvoller Anzeige- und Eingabe-Formatunterstützung. Ich konzentriere mich hier vor allem auf die Datumsformatunterstützung.

Was ist das für eine UI-Komponente? Dazu gibt es Java-Tutorials. Ich werde hier den Link zu JSpinner angeben, das intern ein JFormattedTextField verwendet. Im ersten Bildbeispiel der Tutorial-Webseite sieht man u.a. ein Monat/Jahr-Eingabefeld mit Label “Another Date”. Interessierte sollten sich das Beispiel mit Java-Webstart runterladen, ausführen und ausprobieren. Wird z.B. der Text-Cursor auf den Monatsteil des Datums gesetzt, dann bewirken anschließend die Pfeiltasten rauf/runter das Inkrementieren oder Dekrementieren des Monatswerts. Wird der Cursor hingegen auf den Jahresteil gesetzt, werden die Pfeiltasten stattdessen den Jahreswert ändern. Mit anderen Worten: Mit Hilfe der vier Pfeiltasten links, rechts, rauf und runter kann ein beliebig!!! strukturiertes Datum gezielt und partiell verändert werden. Auch eine Addition von Kalenderwochen oder eine Änderung des Zeitzonen-Offsets ist so realisierbar.

Der JSpinner bietet darüberhinaus zwei kleine Buttons, die ähnlich wie die Pfeiltasten wirken, nur eben per Mausklick. Und wenn man sich dazu noch einen weiteren Button mit einer DatePicker-Popup-Komponente denkt, hat man wirklich die ultimative Datums- und Zeiteingabekomponente vorliegen. Maximaler Eingabe- und Anzeigekomfort per Tastatur oder Mausklick.

Bleibt noch die Frage, was eine Datums- und Zeitbibliothek leisten muß, um eine solche UI-Komponente zu unterstützen. Die technische Antwort lautet: Unterstützung für das java.text.AttributedCharacterIterator-Konzept. Der Datumswert muß nämlich während der Formatierung zu einem Text im UI-Control zugleich dem Control mitteilen, welcher Teil des Texts für welches Element im Datum steht. Oder anders ausgedrückt: Das Control muß wissen, von welchem Start-Index bis zu welchem End-Index z.B. ein Monatselement vorliegt. Genau das leistet das besagte AttributedCharacterIterator-Konzept, und zwar über die java.text.Format-Methode formatToCharacterIterator(). Beim Design des Format-APIs von Time4J, meiner kommenden Datumsbibliothek habe ich hierauf zu achten.

Wie sieht es damit im JSR-310 aus, der neuen Standardbibliothek von Java 8? Dazu hatte ich eine Frage auf deren Mailing-Liste gestellt. Die Antworten der Projektleiter sind bemerkenswert. Ich war erst mal sprachlos. Tatsächlich kennt der Oracle-Vertreter im JSR 310 noch nicht einmal diese Technik. Und auch sonst habe ich das Gefühl, daß niemand dort den technischen Hintergrund voll erfasst hat. Ich habe in meiner Antwort aus naheliegenden Gründen darauf verzichtet, Oracle seine alten, aber in diesem Fall exzellenten Produkte näher zu erklären. Es wird also im JSR-310 wohl dabei bleiben, daß wir in der JavaDoc zur neuen 310-Klasse DateTimeFormatter lesen müssen:

public java.text.Format toFormat()
Returns this formatter as a java.text.Formatinstance.The returned Format instance will format any TemporalAccessor and parses to a resolved TemporalAccessor.

Exceptions will follow the definitions of Format, see those methods for details about IllegalArgumentException during formatting and ParseException or null during parsing. The format does not support attributing of the returned format string.

Returns:

this formatter as a classic format instance, not null

Ein Jammer, das JFormattedTextField zwar in Swing, aber bis jetzt noch nicht in JavaFX vorhanden ist. Ich glaube, sollte keine entsprechende Komponente in JavaFX bald kommen, werde ich eben selbst eine erstellen – mit extra Unterstützung für Time4J und durch Time4J. Nur meine aktuellen Arbeitskapazitäten verhindern das noch.

Die Kommentarfunktion ist geschlossen.