如何在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属性:
- 在对话框控制器中添加两个
TextFormatter成员变量:
val rowsTextFormatter = TextFormatter<Int>(IntegerStringConverter(), 0, numberValidationFormatter()) val colsTextFormatter = TextFormatter<Int>(IntegerStringConverter(), 0, numberValidationFormatter())
- 修改原有的赋值代码:
// 替换原来的直接赋值逻辑 rows.textFormatter = rowsTextFormatter columns.textFormatter= colsTextFormatter
- 后续即可通过这两个
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
相关产品推荐
相关产品推荐

