[JavaFX] getValue() vom Spinner auf Integer überprüfen?
Ich möchte mit
int test = Integer.parseInt(String.valueOf(gMI.getController().test_Spinner.getValue()));
try {
Integer.parseInt(String.valueOf(test));
System.out.println(test);
} catch (NumberFormatException nfe) {
System.out.println("Muss eine Zahl enthalten.");
}
prüfen, ob man in den Spinner (test_Spinner) eine Zahl eingetragen hat und wenn ein Zeichen mit drin ist, das keine Zahl ist, wird "Muss eine Zahl enthalten." ausgegeben, da der Spinner ja nur eine Zahl enthalten darf.
Bis zum Eingeben einer Zahl funktioniert auch alles, bis ich einen Buchstaben dazugebe... Dann kommt folgende Fehlermeldung, obwohl ich ja mit try catch dies ausgrenzen will.
In Controller.java in public void initialize() ist
SpinnerValueFactory<Integer> test = new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 60, 0);
this.test_Spinner.setValueFactory(test);
eingetragen. Was mache ich also falsch?
Folgendes ist die Lösung, um zu überprüfen, ob der Inhalt eine Ganzzahl enthält:
SpinnerValueFactory<Integer> spinner = new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 365, 0);
StringConverter<Integer> sci = spinner .getConverter();
StringConverter<Integer> sci2 = new StringConverter<>() {
@Override
public Integer fromString(String value) {
try {
return sci.fromString(value);
} catch (NumberFormatException nfe) {
System.out.println("Bad integer: " +
value);
return 0;
}
}
@Override
public String toString(Integer value) {
return sci.toString(value);
}
};
spinner .setConverter(sci2);
this.options_Spinner_StartInterval_days.setValueFactory(spinner );
1 Antwort
Die Standardkonverter für die Spinner Factories fangen falsche Eingaben nicht so gut ab, du müsstest dir selbst einen Converter schreiben. Dazu brauchst du eine Klasse, die von StringConverter<Integer> erbt. Eine Instanz von ihr kannst du anschließend an die ValueFactory deines Spinner-Objekts übergeben.
Ungefähr so:
var factory = (SpinnerValueFactory.IntegerSpinnerValueFactory) spinner.getValueFactory();
var converter = new YourConverter(
spinner.getEditor(),
factory.getMin(),
factory.getMax());
factory.setConverter(converter);
Deine Prüfung hingegen kommt einfach zu spät. Die Eingabe wird schon früher verwertet.
Ich habe tatsächlich eine Lösung gefunden, damit ich eine personalisierte Fehlermeldung ausgeben lassen kann ...
In der Frage ergänzt.