JavaFX TextField Eingabe formatieren/einschränken

godi

Aktives Mitglied
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:

Code:
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
 
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:

Java:
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
 

Zurück
Oben