# JavaFX TextField Eingabe formatieren/einschränken



## godi (4. Nov 2012)

Hallo,

ich würde gerne in JavaFX bei einem TextField nur bestimmte Werte (z.B nur Float) zulassen.
Dazu habe ich mir eine Klasse erstellt:


```
import javafx.scene.control.TextField;

public class TextFieldFloat extends TextField {
	public TextFieldFloat() {
		super();		
	}

	public TextFieldFloat(String arg0) {
		super(arg0);		
	}
		

	@Override 
	public void replaceText(int start, int end, String text) {		
		if (!text.matches("[^0-9]")) {
			super.replaceText(start, end, text);
		}		
		else if ((text.charAt(0) == '-') && (start == 0)) {
			super.replaceText(start, end, text);
		}
		else if ((text.charAt(0) == '.') && (getText().indexOf('.') == -1)) {
			super.replaceText(start, end, text);
		}
	}

	@Override 
	public void replaceSelection(String text) {		
		if (text.matches("[0-9]")) {
			super.replaceSelection(text);
		}		
	}	
}
```

Wenn direkt in das TextField geschrieben wird dann funktioniert die Formatierung auf Float sehr gut.
Aber wenn ein Text in das TextField kopiert wird dann funktioniert die Formatierung nicht mehr da ja die Methode replaceSelection aufgerufen wird und in dieser gibt es keinen Start und Endwert so dass ich nicht ermitteln kann ob zb ein Punkt schon vorhanden ist oder nicht.

Wie könnte ich dies umsetzen?

Gibt es eigentlich in JavaFX auch so Document-Vorlagen wie in Swing damit gewisse Eingaberegeln (wie bei einem Datum 01.01.12) eingehalten werden müssen oder nicht?

godi


----------



## Paddelpirat (4. Nov 2012)

Ich denke du benutzt am besten den ChangeListener, der greift, sobald sich irgendwas am Input ändert.

Edit: habs zwar selbst noch nicht ausprobiert, aber vielleicht kannst du dir hier etwas abschauen: JavaFX NumberTextField and Spinner Control | Javalobby


----------



## godi (5. Nov 2012)

Mit dem ChangeListener hab ich irgendwie nichts zusammengebracht.
Ist nur viel komplizierter geworden und hat nicht richtig funktioniert.

Aber jetzt habe ich eine brauchbare Lösung:


```
import javafx.scene.control.TextField;

public class TextFieldFloat extends TextField {	

	public TextFieldFloat() {
		super();		
	}

	public TextFieldFloat(String arg0) {
		super(arg0);	
	}


	@Override 
	public void replaceText(int start, int end, String text) {	

		if (!text.matches("[^0-9]")) {
			super.replaceText(start, end, text);
		}		
		else if ((text.charAt(0) == '-') && (start == 0)) {
			super.replaceText(start, end, text);
		}
		else if ((text.charAt(0) == '.') && (getText().indexOf('.') == -1)) {
			super.replaceText(start, end, text);
		}

	}

	@Override 
	public void replaceSelection(String text) {			
		int start = getSelection().getStart();
		int end = getSelection().getEnd();
		String str = getText().substring(0, start) + text + getText().substring(end, getText().length());

		if (text.equals("")) {
			super.replaceSelection(text);
		}		
		else {
			Float fl;
			try {
				fl = Float.parseFloat(str);
				super.replaceText(0, getText().length(),  fl.toString());
			}
			catch (NumberFormatException e) {
				return;
			}
		}			

	}	

}
```

godi


----------

