NumberFormatException в Spinner

У меня есть что-то похожее на мой метод "инициализации":

SpinnerValueFactory<Double> betaValueFactory = new SpinnerValueFactory.DoubleSpinnerValueFactory(-9999999, 9999999, 0);
this.betaSpinner.setValueFactory(betaValueFactory);
SpinnerValueFactory<Integer> temperatureValueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(-9999999, 9999999, 0);
this.temperatureSpinner.setValueFactory(temperatureValueFactory);

Проблема в том, что когда пользователь вводит что-то не то, например, "ааа" в одном из счетчиков, у меня возникает такое исключение:

Exception in thread "JavaFX Application Thread" java.lang.NumberFormatException: For input string: "aaa"
    at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
    at java.base/java.lang.Integer.parseInt(Integer.java:658)
    at java.base/java.lang.Integer.valueOf(Integer.java:989)
    at javafx.base/javafx.util.converter.IntegerStringConverter.fromString(IntegerStringConverter.java:49)
    at javafx.base/javafx.util.converter.IntegerStringConverter.fromString(IntegerStringConverter.java:35)
    at javafx.controls/javafx.scene.control.Spinner.commitValue(Spinner.java:460)
    at javafx.controls/javafx.scene.control.Spinner.lambda$new$3(Spinner.java:168)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:348)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
    at javafx.base/javafx.beans.property.ReadOnlyBooleanPropertyBase.fireValueChangedEvent(ReadOnlyBooleanPropertyBase.java:72)
    at javafx.graphics/javafx.scene.Node$FocusedProperty.notifyListeners(Node.java:8159)
    at javafx.graphics/javafx.scene.Node.setFocused(Node.java:8212)
    at javafx.graphics/javafx.scene.Scene$KeyHandler.setWindowFocused(Scene.java:4038)
    at javafx.graphics/javafx.scene.Scene$KeyHandler.lambda$new$0(Scene.java:4060)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper$Generic.fireValueChangedEvent(ExpressionHelper.java:348)
    at javafx.base/com.sun.javafx.binding.ExpressionHelper.fireValueChangedEvent(ExpressionHelper.java:80)
    at javafx.base/javafx.beans.property.ReadOnlyBooleanPropertyBase.fireValueChangedEvent(ReadOnlyBooleanPropertyBase.java:72)
    at javafx.base/javafx.beans.property.ReadOnlyBooleanWrapper.fireValueChangedEvent(ReadOnlyBooleanWrapper.java:103)
    at javafx.base/javafx.beans.property.BooleanPropertyBase.markInvalid(BooleanPropertyBase.java:111)
    at javafx.base/javafx.beans.property.BooleanPropertyBase.set(BooleanPropertyBase.java:145)
    at javafx.graphics/javafx.stage.Window.setFocused(Window.java:674)
    at javafx.graphics/javafx.stage.Window$1.setFocused(Window.java:149)
    at javafx.graphics/com.sun.javafx.stage.WindowHelper.setFocused(WindowHelper.java:112)
    at javafx.graphics/com.sun.javafx.stage.WindowPeerListener.changedFocused(WindowPeerListener.java:64)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.run(GlassWindowEventHandler.java:126)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.run(GlassWindowEventHandler.java:40)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.lambda$handleWindowEvent$4(GlassWindowEventHandler.java:176)
    at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:412)
    at javafx.graphics/com.sun.javafx.tk.quantum.GlassWindowEventHandler.handleWindowEvent(GlassWindowEventHandler.java:174)
    at javafx.graphics/com.sun.glass.ui.Window.handleWindowEvent(Window.java:1351)
    at javafx.graphics/com.sun.glass.ui.Window.notifyFocus(Window.java:1330)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    at java.base/java.lang.Thread.run(Thread.java:830)

Я хотел бы решить эту проблему, заставив пользователя ввести правильное значение, отобразив предупреждение с небольшим сообщением, но я не знаю, как это сделать, поэтому вы мне нужны. Спасибо за вашу помощь.


person JorisV    schedule 27.02.2020    source источник
comment
Вкратце (сейчас нет времени для полного ответа, но, возможно, кто-то еще поддержит этот комментарий), создайте TextFormatter, который допускает только целочисленное представление, и передать его betaSpinner.getEditor().setTextFormatter(...)   -  person James_D    schedule 27.02.2020
comment
Вставить только числа в Spinner Control   -  person Abra    schedule 27.02.2020
comment
Наконец-то это сработало, спасибо за помощь! Но теперь у меня есть другая проблема: когда я помещаю значение, подобное 1,2, в счетчик с помощью DoubleSpinnerValueFactory, он автоматически преобразует его в 1,0, и единственное, что работает, это 1,2 вместо 1,2, но я хотел бы принять оба. Вы знаете, как я могу это сделать?   -  person JorisV    schedule 04.03.2020