import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;
/**
* Diese Klasse ist ein Dokument für Textfelder, welches...
*
* 1. Eingabe auf x Zeichen begrenzt.
* 2. Nur die Zeichen zulässt die in der Variable valid stehen
* 3. Nur 1 Komma bzw. Minus zulässt
* 4. Auf Vor- und Nachkommastellen achtet(anzahl)
*
* Die Zuweisung geschieht über
* JTextfield.setDocumenT(new TabDecimalDocument(int anzahl));
*/
public class TabDecimalDocument extends PlainDocument{
private static final long serialVersionUID = 5032290234368360350L;
private int maxLen = -1;
private int places_befor_decimal_point = 0;
private int places_after_decimal_point = 0;
/**
* Konstruktor für das Validationdokument
* @param int limit: maximale Anzahl der einzugebenen Zeichen
*/
public TabDecimalDocument(int maxLen) {
this.maxLen = maxLen;
}
/**
* Funktion überschreibt die Methode insertString von PlaintDocument
* @param int offset: Position
* @param String str: der String
* @param AttributeSet attr: Attributset
*/
public void insertString (int offset, String str, AttributeSet attr) throws BadLocationException {
//Zeichenkette mit den gültigen Zeichen
String valid = "-.0123456789 ";
if (str != null && maxLen > 0 && this.getLength() + str.length() > maxLen) {
java.awt.Toolkit.getDefaultToolkit().beep();
return;
}
// wenn das '-' nicht am anfang steht wird es nicht zugelassen
if(offset != 0 && str.equals("-")){
return;
}
for (int i=0; i<str.length();i++) {
// nur gültige Zeichen zulassen
if (valid.indexOf(str.charAt(i)) == -1) {
return;
}
// nur einen Punkt('.') zulassen
String str_eingabe = getText(0, offset) + str;
int count = 0;
for (int y = 0; y < str_eingabe.length(); y++){
if(str_eingabe.charAt(y) == '.'){
count++;
}
if(count > 1){
return;
}
}
// nur ein Minus('-') zulassen
count = 0;
for (int y = 0; y < str_eingabe.length(); y++){
if(str_eingabe.charAt(y) == '-'){
count++;
}
if(count > 1){
return;
}
}
// Vor- und Nachkommastellen prüfen
if(str_eingabe.indexOf("." ) != -1){
// prüfung Nachkommastellen
if(str_eingabe.substring(str_eingabe.indexOf(".")+1).length() > places_after_decimal_point)
return;
// prüfung Vorkommastellen (wenn '.' vorhanden)
if(str_eingabe.substring(0, str_eingabe.indexOf(".")).length() > places_befor_decimal_point)
return;
}else{
// prüfung Vorkommastellen (wenn kein '.' vorhanden)
if(this.getLength() + str.length() > places_befor_decimal_point)
return;
}
}
// Den resultierenden String zusammensetzen
String s = new StringBuffer(getText(0, getLength())).insert(offset, str).toString();
// und gucken, ob Format stimmt
if(s.matches("[0-9]+(,[0-9]{0,2})?")){
//Wichtig Aufruf der übergeordneten Methode
super.insertString(offset, str, attr);
}
}
public void setPlacesBeforDecimalPoint(int places){
places_befor_decimal_point = places;
}
public void setPlacesAfterDecimalPoint(int places){
places_after_decimal_point = places;
}
}