如何在TornadoFX中限制文本框仅允许输入数字
作为TornadoFX和JavaFX的新手,想要限制文本框只输入整数来避免数据库异常?太理解这种需求了!我给你两个简单好用的方案,一步步来,保证你能快速搞定~
方法1:用TornadoFX内置的
IntegerField(最推荐!) TornadoFX本来就为这类场景做了简化,IntegerField组件天生只允许输入整数,完全不用自己写复杂的验证逻辑,对新手友好到爆!
直接在你的视图里这么写:
class AmountInputView : View() { // 用IntegerProperty绑定输入值,直接就是整数类型 val amountProperty = SimpleIntegerProperty() override val root = vbox(spacing = 10) { integerfield(amountProperty) { promptText = "请输入整数金额" // 还可以加一些样式提示,比如输入为空时的提示 styleClass.add("amount-input") } button("提交到数据库") { action { // 直接拿整数用,不用转类型,安全得很 val amount = amountProperty.value // 这里写你的数据库存储逻辑就行 println("准备存储金额:$amount") } } } }
这个组件会直接拦截非数字的输入,用户根本输不进去字母、符号这些乱七八糟的东西,而且绑定的amountProperty直接就是整数,存数据库的时候直接取value就行,完全不用担心类型转换出错。
方法2:给普通
TextField加文本过滤器(JavaFX原生方案) 如果你因为某些原因必须用普通的TextField,那可以给它设置一个TextFormatter来过滤输入,只允许整数通过:
class AmountInputView : View() { override val root = vbox(spacing = 10) { textfield { promptText = "请输入整数金额" // 创建只允许数字输入的过滤器 val integerFilter = TextFormatter<String> { change -> // 允许删除操作,或者输入的内容是纯数字 if (change.isDeleted || change.controlNewText.matches(Regex("\\d*"))) { change } else { null // 拒绝非数字输入 } } textFormatter = integerFilter button("提交") { action { // 把输入转成整数,用toIntOrNull避免空或无效值报错 val amount = integerFilter.value.toIntOrNull() ?: 0 // 这里处理数据库存储 println("存储金额:$amount") } } } } }
这里用正则\\d*匹配数字,用户输入任何非数字内容都会被直接拦截,输不进去。提交的时候用toIntOrNull做个兜底,防止用户什么都没输入的情况,给个默认值0(你也可以改成自己需要的默认值)。
额外小贴士:限制正整数或范围
如果你的金额需要是正整数(不能为0或负数),可以稍微修改过滤器的逻辑:
val positiveIntegerFilter = TextFormatter<String> { change -> val newText = change.controlNewText // 允许删除,或者输入是空,或者是纯数字且不以0开头(可选) if (change.isDeleted || newText.isEmpty() || (newText.matches(Regex("\\d+")) && !newText.startsWith("0"))) { change } else { null } }
这样用户就不能输入0开头的数字(比如0123),也不能输入非正的数字啦。
这两种方法都很容易上手,优先推荐第一种用IntegerField,毕竟TornadoFX就是帮我们减少重复工作的!如果还有其他问题随时问~
内容的提问来源于stack exchange,提问作者Ali Haroon
相关产品推荐
相关产品推荐

