weixin_39918128 2020-11-20 18:07
浏览 0

Provide Kotlin API For JavaFX Validation

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

  • 写回答

5条回答 默认 最新

  • weixin_39918128 2020-11-20 18:07
    关注

    Original comment by Andres Almiray (Bitbucket: aalmiray, GitHub: aalmiray).

    I believe the point is to allow multiple validators, not necessarily Kotlin support.

    评论

报告相同问题?