我正在尝试在魔方 Scala 应用程序中实现 MVC 设计模式。
在 Java 中,我会通过ActionListener
在控制器类中使用侦听器向按钮添加一个来做到这一点。在 Scala 中,我发现这非常困难。谁能给我一些如何做到这一点的例子?
我正在尝试在魔方 Scala 应用程序中实现 MVC 设计模式。
在 Java 中,我会通过ActionListener
在控制器类中使用侦听器向按钮添加一个来做到这一点。在 Scala 中,我发现这非常困难。谁能给我一些如何做到这一点的例子?
当然,您可以使用与在 Java 中完全相同的方式进行操作。但是,使用 Scala,您也可以使用 Scala swing 库来执行此操作,它提供了一组围绕 Java Swing 类的包装器。它使用发布者和反应器的概念来观察和响应事件。可以在此处找到有关库设计的介绍,包括示例。
Publisher
trait 定义了一个publish(e: Event)
方法来通知所有注册的 Reactor 一个事件。您可以通过简单地扩展此 trait 使任何类成为发布者,并调用 publish 方法来发布您的事件。可以使用 方法注册一个reactor,使用def listenTo(ps: Publisher)
注销一个reactor def deafTo(ps: Publisher)
。在监听发布者时,您可以通过添加类型为 的响应来响应来自该发布者的事件PartialFunction[Event, Unit]
,如下所示
class MyComponent {
listenTo(publisher)
reactions += {
case e: MyEvent => println("Got event " + e)
}
}
下面是一些使用 Scala-swing 的(完全不完整的)代码,希望可以为您提供如何在 MVC 模式中使用它的想法。此外,您可能想查看作为库一部分的测试包,您可以在其中找到许多示例。
import scala.swing
import scala.swing.event._
case object MyBusinessEvent extends Event
class MyController extends Publisher {
val form = new MyForm
listenTo(form)
reactions += {
case MyBusinessEvent => //handle event code here
}
}
class MyForm extends Publisher {
val ui = new GridBagPanel {
val c = new Constraints
.... more code here
}
val button1 = new Button("Button 1")
//add button to panel
listenTo(button1)
reactions += {
case ButtonClicked(_) => publish(MyBusinessEvent)
}
}
表单中的listenTo(button1)
方法将通知表单任何按钮事件。在这种情况下,它将对事件做出反应,该ButtonClicked
事件是在 scala-swing 库中定义的事件。在此示例中,表单只是将按钮事件重新发布到某个自定义的业务事件。控制器类依次侦听表单,并可以以适当的方式对业务事件做出反应。