问题描述
我想在Tornadofx应用程序中显示一个对话框,但是我不想在视图中创建对话框。我试图在控制器上创建一个对话框,但这似乎不起作用。
这是一个有效的示例,说明了如何在视图中创建对话框
class MainScreenSelect : View("tool") {
override val root = vBox {
dialog("dialog") {
// Code how the dialog looks and how it behaves
}
}
}
我的问题是,我不想在View内创建对话框,而是想在控制器内创建对话框。我将View的VBox分配给控制器内部的变量,并希望在控制器内部创建对话框。
然后这将是我的视图
class MainScreenSelect : View("tool") {
private val controller : Controller by inject()
override val root = vBox {
controller.vBox = this
controller.showDialog()
}
}
视图的VBox分配给控制器内部的变量,下一行应创建一个对话框。
我的控制器将如下所示
class ChatScreenController : Controller() {
var vBox : VBox by singleassign()
fun showDialog(){
vBox.apply{
dialog{} // Here is the error,I can't call dialog at this point,but I can
// call it if I do vBox.apply inside the View
}
}
我的问题是,为什么不能在控制器内部创建对话框?我可以在vBox.apply中创建其他任何元素,例如另一个vBox,button ...,但是没有对话框。错误在哪里?如何从控制器而不是视图创建对话框?
编辑:我已经尝试使用创建一个对话框
Dialog<R>().apply{
//CODE
}
这将创建一个对话框,但它不会锁定我的主屏幕以强制输入,并且我无法通过按X来关闭此窗口(说实话,我并不真正知道我对Dialog做了什么,但是如果这是我要研究的方法,以及如何使用此对话框)
解决方法
已解决:我的错误是,我认为“对话框”属于UI元素vbox,但对话框与视图相关。将控制器内部的变量更改为View而不是UI元素,可以为该View创建一个对话框。
这是新的控制器
class ChatScreenController : Controller() {
var view : View by singleassign()
fun showDialog(){
view.dialog{
// Code for the Dialog
}
}
需要更改视图以将其自身分配给控制器内部的变量视图
class MainScreenSelect : View("tool") {
private val controller : Controller by inject()
override val root = vbox {
controller.view = this@MainScreenSelect
controller.showDialog()
}
}