我试图在Rubik的多维数据集Scala应用程序中实现MVC设计模式。如何在Scala中添加侦听器到Swing组件?
在Java中,我将通过添加ActionListener
的按钮与控制器类听众做到这一点。在斯卡拉,我发现这非常困难。任何人都可以给我一些如何做到这一点的例子吗?
我试图在Rubik的多维数据集Scala应用程序中实现MVC设计模式。如何在Scala中添加侦听器到Swing组件?
在Java中,我将通过添加ActionListener
的按钮与控制器类听众做到这一点。在斯卡拉,我发现这非常困难。任何人都可以给我一些如何做到这一点的例子吗?
你当然可以用和Java一样的方法来完成它。然而,使用Scala,您也可以使用Scala swing库来执行此操作,它提供了一组围绕Java Swing类的包装器。它使用publishers和reactors的概念来观察事件并对事件做出反应。图书馆的设计介绍,包括样本,可以找到here。
的Publisher
性状限定publish(e: Event)
方法向所有注册的反应器通知关于事件。您可以通过简单地扩展此特征来使任何类成为发布者,并调用发布方法来发布您的事件。可以使用方法def listenTo(ps: Publisher)
注册反应器,并使用def deafTo(ps: Publisher)
取消注册。当听一个发布者,则可以通过添加反应,其具有类型PartialFunction[Event, Unit]
这个出版商事件作出反应,如下
class MyComponent {
listenTo(publisher)
reactions += {
case e: MyEvent => println("Got event " + e)
}
}
下面是使用的Scala摆幅有希望提供一些(完全不完全的)代码你有一个想法如何在MVC模式中使用它。您也可以查看作为库的一部分的test package,您可以在其中找到许多示例。
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库中定义的事件。在此示例中,表单只是将按钮事件重新发布到某个自定义的业务事件。控制器类依次监听表单,并以适当的方式对业务事件做出反应。
获取我的投票,以获得质量与答案之间的最大对比! – 2011-06-07 08:30:42
@Arjan谢谢你!这实际上是一个很好的回应,但它似乎并没有在我的项目上工作,因为我的控制器类和我的UI类都在分离的文件上,它也给了我在发布(事件)行的类型错误,我已经上传了我的项目这里:[链接](https://rapidshare.com/files/1639863150/rubik.rar)如果你可以看看,我将非常感激它..直到然后生病尝试使它工作..非常感谢! – oscar 2011-06-07 14:32:47
@oscar:分离的文件不能有任何问题。从快速浏览代码看来,您可以从MainFrame类中调用publish(event)。您应该将该块移动到顶级RubikUI类,以使其正常工作。如果你只是在你的问题中发布了代码和错误信息(你仍然可以编辑它),这将有所帮助,因为这种方式使得给出一个适当的答案是一个相当长期的经验。 – 2011-06-07 17:09:13