Logo VB-EDV-Beratung

VbDateField

Die Klasse VbDateField ist eine Erweiterung der Klasse JTextField, die ein Datum einliest.

Als zusätzliche Informationen werden
format das Format für die Darstellung
df das DateFormat für die Darstellung
date der Datums-Wert
charset die erlaubten Zeichen
len die Länge des Feldes
gespeichert.
package vb;

import java.text.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.text.*;

public class VbDateField extends JTextField implements FocusListener {
    String format = "dd.MM.yyyy";
    DateFormat df;
    Date date = null;
    char[] charset = "0123456789.".toCharArray();
    int len = 12;

Die Konstruktoren.

    public VbDateField() {
        setup();
    }

    public VbDateField(Date date) {
        this.date = date;
        setup();
        showDate();
    }

setup() macht die Initialisierung bzw. Änderungen.

    void setup(){
        addFocusListener(this);
        df = new SimpleDateFormat(format);
        Dimension d = getPreferredSize();
        d.width = getFontMetrics(getFont()).stringWidth("99.99.9999") +6;
        setPreferredSize(d);
    }

setDate(Date date) setzt den Text des Feldes auf den Wert von date.

    public void setDate(Date date){
        this.date = date;
        showDate();
    }

showDate() zeigt den Datumswert an.

    void showDate(){
        if (date == null)
            setText("");
        else
            setText(df.format(date));
    }

getDate() gibt den Datums-Wert des Feldes zurück und löst gegebenenfalls eine VbDialogException aus.

    public Date getDate() throws VbDialogException {
        Date ret;
        try {
            if (getText().length() == 0)
                return null;
            ret = new SimpleDateFormat("dd.MM.yy").parse(getText());
        } catch (ParseException pe) {
            throw new VbDialogException(this,"ungültiges Datum '" + getText() + "'");
        }
        return ret;
    }

Wenn das Feld den Fokus verliert, soll der Inhalt ordentlich formatiert werden. focusGained ist nur da, damit das Interface FocusListener vollständig ist.

    public void focusLost(FocusEvent fe){
        if (!fe.isTemporary()) {
            try {
                setDate(getDate());
            } catch (VbDialogException vde) {
                Toolkit.getDefaultToolkit().beep();
            }
        }
    }

    public void focusGained(FocusEvent fe){
    }

charOk überprüft, ob ein Zeichen zulässig ist.

    boolean charOk(char ch){
        if (charset == null)
            return true;
        for (int i=0;i<charset.length;i++)
            if (ch == charset[i])
                return true;
        return false;
    }

Damit nur zulässige Zeichen und nur bis zur maximalen Länge eingegeben werden können, wird einfach als Dokumenten-Model ein eingeschränktes PlainDocument verwendet.

    protected class VbDateFieldDocument extends PlainDocument {
        public void insertString(int offs, String str, AttributeSet a)
            throws BadLocationException {
            if (str == null)
                return;
            char[] source = str.toCharArray(),
                   result = new char[source.length];

            int j = 0, nChar = getLength();
            for (int i=0; i<source.length; i++) {
                if (charOk(source[i]) && (nChar++ < len))
                    result[j++] = source[i];
                else {
                    Toolkit.getDefaultToolkit().beep();
                }
            }
            super.insertString(offs, new String(result, 0, j), a);
        }
    }

    protected Document createDefaultModel() {
        return new VbDateFieldDocument();
    }

Und hier gibt's VbDateField.java noch mal im Stück.

© 2003 Volker Böhm Best viewed with any Browser Valid HTML 4.0