Original report by napperley (Bitbucket: napperley, GitHub: napperley).
A separate Kotlin API is required in order to get full JavaFX validation support. Currently only a single Validator can be assigned to each JavaFX Control in a Scene. The following Kotlin code will fail when trying to assign multiple validators to a control:
#!Kotlin
fun String.isDouble(): Boolean{
var result = true
if (this.isNotEmpty()) {
try {
this.toDouble()
} catch (ex: NumberFormatException) {
result = false
}
}
return result
}
class MainWindowController {
private lateinit var inputVoltageTxt: TextField
private lateinit var outputVoltageTxt: TextField
private lateinit var resistance1Txt: TextField
private lateinit var resistance2Txt: TextField
private lateinit var calculateBtn: Button
private fun initialize() {
val MAX_LENGTH = 6
val NUM_MSG = "A valid number must be entered"
val MAX_LENGTH_MSG = "Field exceeds the maximum length ($MAX_LENGTH) allowed"
val validation = ValidationSupport()
val maxLengthValidator = { control: Control, newVal: String ->
ValidationResult.fromErrorIf(
control, MAX_LENGTH_MSG, if (control is TextField) control.length > MAX_LENGTH else false
)
}
val doubleValidator = { control: Control, newVal: String ->
ValidationResult.fromErrorIf(
control, NUM_MSG, if (control is TextField) !control.text.isDouble() else false
)
}
validation.registerValidator(inputVoltageTxt, false, Validator.combine(doubleValidator, maxLengthValidator))
validation.registerValidator(outputVoltageTxt, false, Validator.combine(doubleValidator, maxLengthValidator))
validation.registerValidator(resistance1Txt, false, Validator.combine(doubleValidator, maxLengthValidator))
validation.registerValidator(resistance2Txt, false, Validator.combine(doubleValidator, maxLengthValidator))
validation.validationResultProperty().addListener { o, oldVal, newVal ->
calculateBtn.isDisable = newVal.errors.isNotEmpty() }
}
// ...
}
该提问来源于开源项目:controlsfx/controlsfx