こんにちは、TornadoFX を使用するのは初めてで、MVP 構造の最適な設計は TornadoFX を使用することでしょうか?
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")
}
}