如何捕获JavaFX可编辑Spinner抛出的NumberFormatException并提示用户
解决方案
这个异常是JavaFX默认的IntegerStringConverter对非数字输入没有做异常捕获导致的,你可以通过自定义带容错处理的字符串转换器来解决,同时可以在捕获异常时弹出提示告知用户:
步骤1:自定义带异常处理的Integer转换器
import javafx.util.converter.IntegerStringConverter; import javafx.scene.control.Alert; import javafx.scene.control.Alert.AlertType; import javafx.scene.control.Spinner; public class SafeIntegerConverter extends IntegerStringConverter { private final Spinner<Integer> spinner; // 存储上一次的合法值,输入非法时可以回滚 private Integer lastValidValue; public SafeIntegerConverter(Spinner<Integer> spinner, Integer initialValue) { this.spinner = spinner; this.lastValidValue = initialValue; } @Override public Integer fromString(String s) { try { Integer value = super.fromString(s); // 额外匹配你设置的50-80的数值范围 if (value >= 50 && value <= 80) { lastValidValue = value; return value; } throw new NumberFormatException("数值超出允许范围:50-80"); } catch (NumberFormatException e) { // 弹出错误提示 Alert alert = new Alert(AlertType.ERROR); alert.setTitle("输入错误"); alert.setHeaderText("无效的数值输入"); alert.setContentText("错误详情:" + e.getMessage() + "\n请输入50到80之间的整数"); alert.showAndWait(); // 回滚为上一次的合法值,避免输入框留空或保留非法内容 spinner.getEditor().setText(lastValidValue.toString()); return lastValidValue; } } }
步骤2:给你的Spinner应用自定义转换器
Spinner<Integer> mySpin = new Spinner<Integer>(50, 80, 50); mySpin.setEditable(true); // 给Spinner的数值工厂设置自定义转换器即可生效 mySpin.getValueFactory().setConverter(new SafeIntegerConverter(mySpin, 50));
该方案会在用户输入非法字符、超出范围的数值时,立刻弹出对应错误提示,同时自动将输入框内容回滚为上一次的合法值,不会抛出未捕获的异常影响程序正常运行。
内容的提问来源于stack exchange,提问作者Al1nuX
相关产品推荐
相关产品推荐

