[JavaFX] Spinner so einstellen, dass er nicht leer bleiben darf?

  • Themenstarter Themenstarter Gelöschtes Mitglied 67123
  • Beginndatum Beginndatum
G

Gelöschtes Mitglied 67123

Gast
Wenn ich einen IntegerSpinner leer lasse und das Feld verlasse, bekomme ich eine NullPointerException, da logischer Weise nichts im Spinner steht.

Ich möchte den Spinner so einstellen, dass er mindestens eine Zahl beinhalten muss und maximal zweistellig sein darf. Ich meine damit nicht den Mindest- oder Maximalwert. Beispiel:

Java:
""    - leer;                 so ists falsch
"1"   - nicht leer;           so ists richtig
"11"  - nicht leer;           so ists richtig
"111" - mehr als zwei Zahlen; so ists falsch

Ich hatte schon mal sehr lange dieses Problem. Nun möchte ich für dieses Problem ebenfalls eine eigene Fehlermeldung ausgeben lassen oder einfach, wie oben beschrieben, verhindern, dass der Spinner leer bleibt oder zu viele Zahlen enthält.

Mit regex kann ich schon mal Folgendes abfragen, sodass der Spinner eine rote Farbe bekommt (als Hinweis), wenn ein non-Integer eingegeben wurde oder zu wenige bzw. zu viele Zahlen eingegeben wurden:

Java:
if (!options_Spinner_StartInterval_seconds.getEditor().getText().matches("^-?\\d+$") || !options_Spinner_StartInterval_seconds.getEditor().getText().matches("^-?\\d.{0,2}$"))
    options_Spinner_StartInterval_seconds.setStyle("-fx-focus-color: #f00;");

Jedoch kann ich damit nicht meinen Plan (siehe oben) umsetzen, da

Code:
spinner.requestFocus()

nicht "greift" - ich kann den Spinner trotzdem verlassen.
 
Mach's dir nicht so schwer, verwende ein Spinnermodel, dann kann man nichts falsch eingeben.
Java:
JSpinner spinner = new JSpinner(new SpinnerNumberModel(2, 1, 999, 1));

Du kannst dem Editor natürlich auch einen InputVerifier zuweisen

Ich benutze jedoch das Framework JavaFX und ich weiß nicht, wie ich solche Eigenschaften einem SpinnerValueFactory zuteilen soll. :/

Java:
Required type: SpinnerValueFactory <java.lang.Integer>
Provided: JSpinner
 
Dann solltest du hier fündig werden.

In meiner Frage habe ich ein kürzlich behobenes Problem verlinkt. Mir ist SpinnerValueFactory.IntegerSpinnerValueFactory bereits bekannt. Darüber konnte ich auch eine benutzerdefinierte Fehlermeldung für "NumberFomatException" machen, wo ich auch gemerkt habe, dass nur darüber ein spinner.requestFocus(); richtig funktioniert.

1. Vorhaben:
Nun möchte ich auch eine benutzerdefinierte Fehlermeldung für "NullPointerException" haben, da ich noch nicht weiß, wie das einzubauen ist, da die Standardkonverter für Spinner Factories falsche Eingaben nicht so gut abfangen.

2. Vorhaben:
Wie kriege ich das also umgesetzt, dass wenn der Spinner leer ist, dass ich den Focus nicht auf ein anderes Element setzen bzw. den Spinner nicht verlassen darf?
 
Ich glaub nicht, dass du den Fokusverlust verhindern kannst, aber du kannst ihn ja gleich im Anschluss wieder anfordern.
EventQueue.invokeLater(...) lässt den UI-Thread erst mal alles ander machen und führt das dann aus.

Um Fokusverlust innerhalb des Formulars von vorneherein zu verhindern, müsstest du ihn schon verhindern, bevor es überhaupt dazu kommen kann, also schon während der Eingabe und nicht erst bei der Validierung des Feldes.


Die NPE sollte gar nicht erst auftreten, du kannst den Code ja so schreiben, dass vor dem Zugriff auf null gerprüft wird. Falls null, dann reagiere entsprechend.
 

Zurück
Oben