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