为什么我的filterInput在某些情况下会收到包含标点符号的格式化数字?

时间:2018-05-22 22:58:15

标签: javafx tornadofx

我有一个文本字段,我只想限制为整数。请参阅下面的代码。

当包含该字段的视图开始,并且如果使用someInteger的初始默认值构建模型时,视图会正确显示数字,而无需额外的格式。它还按预期过滤新输入的输入。

重构模型时没有默认值会出现问题。作为整数属性,它默认为0.当我稍后为属性分配新值时,传递的controlNewText包含标点符号,例如1,234。这会导致检查失败,并且新分配的值将从视图中过滤掉。

为什么controlNewText首先被格式化了?有没有办法防止这种情况?

textfield(model.someInteger) {
    required()
    textFormatter = TextFormatter(IntegerStringConverter(), model.item.someInteger)
    stripNonInteger()
    filterInput { it.controlNewText.isInt() }
}

class SomeData {
    val someIntegerProperty = SimpleIntegerProperty(this, "someInteger")
    var someInteger by someIntegerProperty
}

class SomeDataModel : ItemViewModel<SomeData>(SomeData()) {
    val someInteger = bind(SomeData::someIntegerProperty)
}

1 个答案:

答案 0 :(得分:0)

格式化由您指定的TextFormatter执行。确保指定一个不添加千位分隔符的程序。这是一个完整的可运行应用程序,用于在格式化程序中配置NumberStringConverter。请注意,我已删除了filterInput语句,因为stripNonInteger已经涵盖了该语句。

class MainView : View("Main view") {
    val model = SomeDataModel()

    override val root = borderpane {
        center {
            form {
                fieldset {
                    field("Some integer") {
                        textfield(model.someInteger) {
                            required()
                            textFormatter = TextFormatter(NumberStringConverter("########"), model.someInteger.value)
                            stripNonInteger()
                        }
                    }
                    button("Set some value").action {
                        model.someInteger.value = 1234
                    }
                }
            }
        }
    }
}

class SomeData {
    val someIntegerProperty = SimpleIntegerProperty(this, "someInteger")
    var someInteger by someIntegerProperty
}

class SomeDataModel : ItemViewModel<SomeData>(SomeData()) {
    val someInteger = bind(SomeData::someIntegerProperty)
}