JavaFX JDBC Eclipse中如何将TextField设为整数/双精度类型
解决TextField处理整数/双精度数值并支持后续计算的问题
现有代码的核心错误
expeditionTime.(Time);是语法错误,TextField的内容设置必须调用setText方法,且该方法仅接受字符串参数expeditionAltitude.setText(Altitude);直接传入int类型会编译报错,setText不支持数值类型参数expeditionDistance = Distance;如果expeditionDistance是TextField对象,这种直接赋值的写法完全错误
核心实现思路
TextField本质是字符串容器,必须将数值转为字符串才能显示,但我们需要单独维护对应的数值类型成员变量——这些变量用于后续计算和数据库存储,TextField仅作为输入/展示的视图载体。
具体实现代码
1. 定义类成员变量
先声明用于存储数值的变量(后续计算/存库用),以及TextField组件引用:
// 用于后续计算、数据库存储的数值变量 private double expeditionTimeValue; private int expeditionAltitudeValue; private int expeditionDistanceValue; // TextField组件引用 private TextField expeditionDate; private TextField expeditionTime; private TextField expeditionAltitude; private TextField expeditionDistance; private TextField expeditionNotes;
2. 修正setTextField方法
将数值转为字符串显示到TextField,同时同步更新数值变量:
void setTextField(String date, double time, int altitude, int distance, String notes) { expeditionDate.setText(date); // 双精度数值转字符串显示,同步更新数值变量 expeditionTime.setText(String.valueOf(time)); expeditionTimeValue = time; // 整数转字符串显示,同步更新数值变量 expeditionAltitude.setText(String.valueOf(altitude)); expeditionAltitudeValue = altitude; expeditionDistance.setText(String.valueOf(distance)); expeditionDistanceValue = distance; expeditionNotes.setText(notes); }
3. 获取用户输入并转为数值类型(含验证)
当需要用输入值计算或存库时,将TextField的字符串内容转回数值类型,同时处理非法输入的异常:
// 处理双精度类型输入 try { expeditionTimeValue = Double.parseDouble(expeditionTime.getText().trim()); } catch (NumberFormatException e) { // 输入非法时的处理逻辑,比如提示用户、设置默认值 System.out.println("请输入合法的时间数值"); expeditionTimeValue = 0.0; expeditionTime.setText(""); } // 处理整数类型输入(海拔) try { expeditionAltitudeValue = Integer.parseInt(expeditionAltitude.getText().trim()); } catch (NumberFormatException e) { System.out.println("请输入合法的海拔数值"); expeditionAltitudeValue = 0; expeditionAltitude.setText(""); } // 处理整数类型输入(距离) try { expeditionDistanceValue = Integer.parseInt(expeditionDistance.getText().trim()); } catch (NumberFormatException e) { System.out.println("请输入合法的距离数值"); expeditionDistanceValue = 0; expeditionDistance.setText(""); }
4. 输入过滤优化(可选)
给TextField添加输入监听,只允许输入合法的数值字符,从源头避免非法输入:
// 双精度TextField:仅允许数字和一个小数点 expeditionTime.textProperty().addListener((observable, oldValue, newValue) -> { if (!newValue.matches("\\d*\\.?\\d*")) { expeditionTime.setText(oldValue); } }); // 整数TextField:仅允许数字 expeditionAltitude.textProperty().addListener((observable, oldValue, newValue) -> { if (!newValue.matches("\\d*")) { expeditionAltitude.setText(oldValue); } }); expeditionDistance.textProperty().addListener((observable, oldValue, newValue) -> { if (!newValue.matches("\\d*")) { expeditionDistance.setText(oldValue); } });
内容的提问来源于stack exchange,提问作者AdrianProvich
相关产品推荐
相关产品推荐

