Связывание метки с постоянно изменяющимся значением из потока - PullRequest
0 голосов
/ 29 августа 2018

У меня очень простой вопрос, но я не смог найти на него ответ. Я уже искал через Google людей с похожими проблемами, но я не нашел ничего полезного. (например, https://github.com/edvin/tornadofx-guide/blob/master/part1/11.%20Editing%20Models%20and%20Validation.md)

У меня есть следующая ViewModel

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 обновляется должным образом, но в значении отсутствуют изменения и они не указаны в метке.

Edit: Я полностью забыл привязать к 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)
}

}

}

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()
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...