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

如何在JavaFX中从带TextFormatter的TextField获取整数值?

JavaFX TextField使用IntegerStringConverter后如何直接读写整数值?

我用JavaFX实现了一个自定义对话框,其中的TextField通过带IntegerStringConverter的TextFormatter限制了输入为数字,因此TextField的内容肯定是整数(范围问题后续处理)。现在遇到的问题是:如何直接以整数形式读写这个TextField的值?目前找到的所有方法都只支持字符串类型,TextFormatter只能用于绑定吗?有没有直接读写整数的方式?

附上自定义对话框的控制器代码(numberValidationFormatter为常规实现,此处省略):

package org.eu.tr480_free.stitcher

import javafx.fxml.FXML
import javafx.fxml.FXMLLoader
import javafx.scene.control.*
import javafx.stage.Modality
import javafx.stage.Window
import javafx.util.converter.IntegerStringConverter
import org.eu.tr480_free.stitcher.View.numberValidationFormatter
import java.io.IOException

class NewFileDlg(val window: Window) : Dialog<ButtonType>() {

    @FXML
    lateinit var FabricCombo: ComboBox<FabricType>

    @FXML
    lateinit var rows: TextField

    @FXML
    lateinit var columns: TextField

    init {
        try {
            val loader = FXMLLoader()
            loader.location = javaClass.getResource("new_file_dialog.fxml")
            loader.setController(this)

            initOwner(window)
            initModality(Modality.APPLICATION_MODAL)
            isResizable = false
            title = "New File"
            dialogPane = loader.load()
            rows.textFormatter = TextFormatter(IntegerStringConverter(), 0, numberValidationFormatter())
            columns.textFormatter= TextFormatter(IntegerStringConverter(), 0, numberValidationFormatter())
        }
        catch (e: IOException) {
            throw RuntimeException("Unable to load asset: new file dialog")
        }
        for (f in FabricType.values()) {
            FabricCombo.items.add(f)
        }
    }
}

补充说明

这是Kotlin与JavaFX交互的特定问题:即使显式指定TextFormatter<Int>,Kotlin会提示泛型冗余(因为支持类型推断),但无论是否指定泛型,getTextFormatter().getValue()的返回类型都会被判定为Any!(本质是可空的Object)。

由于是临时存在的自定义对话框,设置监听器并非合理方案,原本打算手动强制类型转换(我可以接受Kotlin无法确定getValue()是否为空的情况),最终找到了更合适的解决方案。


解决方案(Kotlin版本)

将TextFormatter实例单独声明为类成员,而非直接赋值给TextField的textFormatter属性:

  1. 在对话框控制器中添加两个TextFormatter成员变量:
val rowsTextFormatter = TextFormatter<Int>(IntegerStringConverter(), 0, numberValidationFormatter())
val colsTextFormatter = TextFormatter<Int>(IntegerStringConverter(), 0, numberValidationFormatter())
  1. 修改原有的赋值代码:
// 替换原来的直接赋值逻辑
rows.textFormatter = rowsTextFormatter
columns.textFormatter= colsTextFormatter
  1. 后续即可通过这两个TextFormatter实例直接获取整数值,无需强制转换或额外空值处理:
val dialog = NewFileDlg(stage)
val result = dialog.showAndWait()
if (result.isPresent && result.get().buttonData == ButtonBar.ButtonData.OK_DONE) {
    val rows = dialog.rowsTextFormatter.value
    val cols = dialog.colsTextFormatter.value
    // 执行后续业务逻辑
}

此时Kotlin会正确识别value的类型为Int,可以直接使用。


内容的提问来源于stack exchange,提问作者digitig

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:43:37