You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:25:55