[英]tornadofx listview is creating one additional null listcellfragment than items in the list
[英]TornadoFX - Creating a MVP Design
您好,我不熟悉TornadoFX,我想知道使用TornadoFX的MVP結構的最佳設計是什么?
在MVP視圖中:
->會將所有事件(例如按鈕單擊)委派給演示者中的功能
->不與模型互動
以下是一些粗略的原型構想:
abstract class AbstractPresenter<View : tornadofx.View> : Controller() {
var view: View by Delegates.notNull()
fun attachView(view: View) {
this.view = view;
}
}
我創建一個演示者,將其自身附加到AbstractView:
abstract class AbstractView<out Presenter : AbstractPresenter<*>> : View() {
abstract val presenter: Presenter
}
現在在示例中使用它:
class SampleTestView: AbstractView<SampleTestPresenter>() {
override val presenter: SampleTestPresenter by inject()
override val root: AnchorPane by fxml()
val testButton: Button by fxid()
init {
presenter.attachView(this)
testButton.setOnAction { presenter.doSomething() }
}
}
樣本演示者:
class SampleTestPresenter: AbstractPresenter<SampleWindowView>() {
fun doSomething() {
println("did it")
}
}
這是使用TornadoFX的MVP模式的不錯實現嗎?
編輯
進行了一些更改:
class SampleWindowView : View() {
override val root: AnchorPane by fxml()
val presenter : SampleWindowViewPresenter by inject()
val button:Button by fxid()
init {
button.setOnAction { presenter.handleButtonClick() }
}
}
class SampleWindowViewPresenter : Controller() {
val sampleView: SampleWindowView by inject()
fun handleButtonClick() {
println("clicked")
}
}
總結以上討論,您可以簡單地執行以下操作:
class SampleTestView : View() {
val presenter: SampleTestPresenter by inject()
override val root: AnchorPane by fxml()
val testButton: Button by fxid()
init {
testButton.setOnAction { presenter.doSomething() }
}
}
class SampleTestPresenter : Controller() {
val view: SampleTestView by inject()
fun doSomething() {
println("Did the thing")
}
}
如果要確保視圖具有演示者,可以創建一個抽象視圖並使所有視圖都從該視圖擴展:
abstract class AbstractView<Presenter : Controller> : View() {
abstract val presenter: Presenter
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.