你好,我刚开始使用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")
}
}发布于 2016-08-13 07:34:01
为了总结上面的讨论,您可以简单地做:
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
}https://stackoverflow.com/questions/38906820
复制相似问题