Logo VB-EDV-Beratung

VbTextField

Die Klasse VbTextField ist eine Erweiterung der Klasse JTextField, bei der man die Länge der Eingabe sowie die in der Eingabe erlaubten Zeichen (z.B. nur Ziffern) vorgeben kann.

Als zusätzliche Informationen werden
len die Gesamtlänge
vlen die sichtbare Länge
upper ob auf Großschrift umgesetzt werden soll
charset ein String mit allen erlaubten Zeichen
gespeichert.
package vb;

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

public class VbTextField extends JTextField {
    int len = 25, vlen = 25;
    boolean upper = false;
    char[] charset = null;

Den verschiedenen Konstruktoren kann man einige Einschränkungen gleich mitgeben.

    public VbTextField() {
        setup();
    }

    public VbTextField(int len) {
        vlen = this.len = len;
        setup();
    }

    public VbTextField(int len, String charset) {
        vlen = this.len = len;
        this.charset = charset.toCharArray();
        setup();
    }

    public VbTextField(int len, int vlen) {
        this.vlen = vlen;
        this.len = len;
        setup();
    }

    public VbTextField(int len, int vlen, String charset) {
        this.vlen = vlen;
        this.len = len;
        this.charset = charset.toCharArray();
        setup();
    }

setup macht die Initialisierung bzw. Änderungen.

    void setup(){
        int width0 = getFontMetrics(getFont()).charWidth('0');
        Dimension d = getPreferredSize();
        d.width = vlen * width0 + 6;
        setPreferredSize(d);
    }

Diese Methoden verändern einzelne Eigenschaften.

    public void setLength(int len){
        this.len = len;
        setup();
    }

    public void setVisibleLength(int vlen){
        this.vlen = vlen;
        setup();
    }

    public void setChars(String charset){
        this.charset = charset.toCharArray();
        setup();
    }

    public void setUpper(boolean upper){
        this.upper = upper;
    }

charOk prüft, ob ein Zeichen erlaubt 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;
    }

Um die Einschränkungen überprüfen zu können, wird einfach als Dokumenten-Model ein eingeschränktes PlainDocument verwendet.

    protected class VbTextFieldDocument 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)){
                    if (upper)
                        result[j++] = Character.toUpperCase(source[i]);
                    else
                        result[j++] = source[i];
                } else {
                    Toolkit.getDefaultToolkit().beep();
                }
            }
            super.insertString(offs, new String(result, 0, j), a);
        }
    }

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

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

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