我正在尝试在一个魔方Scala应用程序中实现MVC设计模式。
在Java中,我会通过将监听器添加到控制器类中的按钮上来完成此操作。在Scala中,我发现这非常困难。有人能给我一些如何做到这一点的示例吗?
在Java中,我会通过将监听器添加到控制器类中的按钮上来完成此操作。在Scala中,我发现这非常困难。有人能给我一些如何做到这一点的示例吗?
Publisher
特征定义了一个publish(e: Event)
方法,以通知所有已注册的Reactor有关事件的信息。您可以通过简单扩展此特征来使任何类成为发布者,并调用发布方法来发布您的事件。可以使用def listenTo(ps: Publisher)
方法注册反应器,使用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库中定义的事件。在此示例中,表单只是将按钮事件重新发布到一些自定义的业务事件中。控制器类依次监听表单,并可以以适当的方式对业务事件做出反应。