【问题标题】:Unable to update button display data无法更新按钮显示数据
【发布时间】:2020-01-29 06:10:45
【问题描述】:

我正在学习 Kotlin 和 TornadoFX 来编写一个非常简单的任务:两个按钮,一个带有 Int 1,另一个带有 Int 200。当我单击按钮一时,我想更新并显示带有 Int 2 的按钮一和其他与 Int 201。以下程序将允许我检查更新数据,并且一切似乎都是正确的。我的问题是为什么按钮上的显示不会相应更新。 请帮忙。

class MainView : View("Hello TornadoFX") {
    val controllera: ControllerA by inject()
    val i: Int? = 1
    val j: Int? = 2
    override val root = hbox {

        button(controllera.s1.toString()) {
            setOnAction {
                setId(i.toString())
                println("  in view button 1 s1: { ${controllera.s1.toString()} }")
                controllera.temp(i)
            }
        }
        button(controllera.s2.toString()) {
            setOnAction {
                setId(j.toString())
                println("  in view button 2 s2:  { ${controllera.s2.toString()} }")
                controllera.temp(j)
            }
        }
        label(title) {
            addClass(Styles.heading)
        }
    }
  }

class ControllerA :Controller(){
     var s1: Int =1
     var s2: Int = 200
    fun temp(k: Int?) {
        when( k) {
            1 -> {println("botton ID  " +k)
                println(" current value of s1:   $s1 ")
                s1 = s1+1
                println(" new value of s1 to update:   $s1 ")
                s2 = s2 +1
                println(" new value of s2 to update:   $s2 ")}
            2 -> {
                println("botton ID  " + k)
                println("current value of  s2:   $s2 ")}
            else -> println("default")
        }
    }
}


test output  at various location:
  in view button 1 s1: { 1 }    //In MainView
botton ID  1        //in ControllerA
 s1:   1 
 new value of s1 to update:   2 
 new value of s2 to update:   201 
  in view button 2 s2:  { 201 } //in MainView
botton ID  2            //in ControllerA
current value of  s2:   201
Note: those updated data will not be display on button text.

【问题讨论】:

    标签: button display tornadofx


    【解决方案1】:

    您需要使用可观察的属性和绑定。只是开始编写代码而不阅读框架并不是一个好方法。我建议您阅读指南作为起点。这是您重写的代码,以便每个按钮在点击时都会显示并增加相应的数字:

    class MainView : View("Hello TornadoFX") {
        val controllera: ControllerA by inject()
        val myModel: MyModel by inject()
    
        override val root = hbox {
    
            button(myModel.s1.asString()) {
                action {
                    controllera.inc(myModel.s1)
                }
            }
            button(myModel.s2.asString()) {
                action {
                    controllera.inc(myModel.s2)
                }
            }
            label(title)
        }
    }
    
    class MyModel : ViewModel() {
        val s1 = SimpleIntegerProperty(1)
        val s2 = SimpleIntegerProperty(200)
    }
    
    class ControllerA : Controller() {
        fun inc(v: IntegerProperty) {
            v.value = v.value + 1
        }
    }
    

    【讨论】:

    • 先生。 Edvin Syse:您建议的程序有效!然而,之前曾多次阅读您的 TornadoFX 指南,并通过网络收集了可观察和观察者的属性。我几乎无法理解所有这些是如何与 TornadoFX 联系在一起的。您的“为什么选择 tornadoFX?”示例对于如此复杂但非常困难的示例,ViewModel 的呈现精美而令人信服。我没有看到如何在 kotlin 和 tornadoFX 中关联 observable 和 binding。现在我愿意。我非常感谢您对 Kolin 和 TornadoFX 项目开发的贡献并教育我们。丹尼尔
    猜你喜欢
    • 2022-09-22
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多