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

1 Antwort

Vom Fragesteller als hilfreich ausgezeichnet

Du könntest dich an das text-Property des Spinner-Textfeldes selbst hängen, um auf Wertänderungen zu reagieren. Das könnte ruhig mit in die Converter-Klasse, bspw. im Konstruktor oder in eine init-Methode, falls es bei einer anonymen Klasse bleiben soll. Allerdings würde ich Ersteres eher befürworten und den Converter in eine eigene Datei (als benannte Klasse) schreiben.

Beispiel:

public class SpinnerInputConverter extends StringConverter<Integer> {
  public SpinnerInputConverter(TextField input, int min, int max) {
    input.textProperty().addListener((observable, oldValue, newValue) -> {
      if (newValue == null || newValue.isEmpty()) {
        setTextValue(oldValue);
        return;
      }

      int value;

      try {
        value = Integer.parseInt(newValue);
      }
      catch (NumberFormatException ex) {
        setTextValue(oldValue);
      }

      if (value < min || value > max) {
        setTextValue(oldValue);
      }
    });
  }

  private static void setTextValue(TextField field, int value) {
    Platform.runLater(() -> field.setText(value));
  }

  // implement fromString, etc. ...
}

In diesem Fall würde bei falscher Werteingabe einfach nur der alte Wert bestehen bleiben. Wenn der schon invalid ist, wäre es besser, als Standardwert bspw. den Minimalwert des Spinners zu nutzen.

Für Fehlermeldungen auf der Programmoberfläche könntest du über den Konstruktor noch eine Referenz auf ein Feld hineinreichen, auf dem du Fehlermeldungen anzeigen möchtest.