Kotlin 将标签绑定到线程中永久更改的值

Kotlin 将标签绑定到线程中永久更改的值,kotlin,tornadofx,Kotlin,Tornadofx,我有一个非常基本的问题,但我找不到答案。我已经通过谷歌搜索过有类似问题的人,但我没有找到任何有用的东西。 (例如) 我有下面的视图模型 class MasterSizeModel(var size : Int) : ViewModel() { val value = bind { size.toProperty() } } 并将其注入另一个类中,在该类中我执行以下操作: masterSize.size = order.masterStatSize masterSize是我的模特 现在

我有一个非常基本的问题,但我找不到答案。我已经通过谷歌搜索过有类似问题的人,但我没有找到任何有用的东西。 (例如)

我有下面的视图模型

class MasterSizeModel(var size : Int) : ViewModel()
{
    val value = bind { size.toProperty() }
}
并将其注入另一个类中,在该类中我执行以下操作:

masterSize.size = order.masterStatSize
masterSize是我的模特

现在在第三个类中,我想将标签中的值绑定到标签

private val recvMaster : Label by fxid("recvMaster")
/*....*/
recvMaster.bind(masterSizeModel.value)
但不幸的是,我的尝试完全失败了。我可以从ModelView中看到大小正在按应有的方式更新,但更改不会出现在标签中显示的值中

编辑: 我完全忘了绑定textProperty(),但我没有进一步的了解

recvMaster.textProperty().bind(masterSizeModel.value/*?*/)
编辑2: 在请求之后,我添加了完整的代码部分:

class Setup : View() {

override val root : VBox by fxml()

/*Adding Buttons and Textfields*/
init {

//Binding all checkboxes to their text field
//Input validation....

//start Button
start.setOnAction {

    val masterSize  = 0

    val masterSizeModel  = MasterSizeModel((masterSize))


  //Open a socket (see code below)
    val req = Requester(ipAdress.text, masterSizeModel)
    val reqModel = RequesterModel(SimpleObjectProperty<Requester>(req))
    val scope = Scope()
    setInScope(reqModel, scope)
    setInScope(masterSizeModel, scope)

    req.sendOrder(SetupOrder(/*Sending stuff throw the network*/))

    val overview = find<Overview>(scope)

    replaceWith(overview)
}

}

}

类请求者(val地址:String=“localhost”,var masterSize:MasterSizeModel):发送者(){ 覆盖val套接字:ZMQ.socket=context.socket(ZMQ.REQ) 覆盖val port=“4993” 初始化{ socket.connect(“$protocol$地址:$port”) } 覆盖订单(订单:订单){ //ZeroMQ需要特别小心。。。。 val消息=packOrder(订单) val wrapper=packOrder(RequestOrder(order.type,message)) socket.send(包装器,0) val orderAsString=socket.recvStr(0) handleOrder(orderAsString) } private fun handleOrder(orderString:String) { val orderDedec=解包订单(orderString) 何时(orderdedeec.type) { OrderType.STAT->{ val order=解包订单(ORDERDEC.order) sleep(5000)//仅用于调试的睡眠 println(“$masterSize,${order.masterStatSize}”) //在这里,我收到一个新值,并希望更新视图中的标签 masterSize.size=order.masterStatSize } OrderType.STOP->{ 关闭() } else->{} } } 覆盖乐趣关闭(){ socket.close() 上下文。术语() } }
请发布您的完整代码,以便我们为您找到问题所在。我建议用构建器替换FXML,以使代码样本更小。另外,删除
MasterSizeModel
构造函数中的参数,这样就不可能注入它。我在您的请求后添加了完整的代码。非常感谢你帮助我。您也需要FXML吗?当我删除MasterSizeModel的参数时,除了简单的按钮操作之外,没有什么神奇的,我需要一个新的类来包装整数吗?对我来说似乎是这样。代码仍然不完整/不可运行,而且涉及的方式也不尽相同。而是创建一个最小的测试用例。顺便说一句,确保不要在按钮的操作回调中长时间运行任何操作。使用
runAsync
class Overview : View() {

    override val root : VBox by fxml()

    private val req : RequesterModel by inject()


    private val masterSizeModel  : MasterSizeModel by inject()

    private val recvMaster : Label by fxid("recvMaster")

     /*Adding buttons and stuff */


    init{
            /*A loop that will request stats from the server i keept it very simple so i can resolv the view problem first */
        var run= true
        val thread = thread(start= true, name="StatRequester"){while(run){req.req.get().sendOrder(StatOrder(OrderType.STAT))}}

        //Change the label whenever the number of recived messages ist raised
        recvMaster.textProperty().set(masterSizeModel.size.toString())


    }

}
class Requester(val address: String = "localhost", var masterSize: MasterSizeModel ) : Sender() {

    override val socket: ZMQ.Socket = context.socket(ZMQ.REQ)
    override val port = "4993"

    init {
        socket.connect("$protocol$address:$port")
    }

    override fun sendOrder(order: Order) {
      //ZeroMQ requires special care....
        val message = packOrder(order)
        val wrapper = packOrder(RequestOrder(order.type, message))
        socket.send(wrapper,0)
        val orderAsString = socket.recvStr(0)
        handleOrder(orderAsString)
    }

    private fun handleOrder(orderString: String)
    {
        val orderDedec = unpackOrder<RequestOrder>(orderString)
        when(orderDedec.type)
        {
            OrderType.STAT ->{
                val order = unpackOrder<StatOrder>(orderDedec.order)
                sleep(5000) //sleep for debugging only
                println("$masterSize, ${order.masterStatSize}")


               //Here I receive a new value and want to update the label in my view
                masterSize.size = order.masterStatSize

            }
            OrderType.STOP ->{
                close()
            }
            else ->{}
        }

    }

    override fun close() {
        socket.close()
        context.term()
    }

}