2011-06-07 79 views
4

我试图在Rubik的多维数据集Scala应用程序中实现MVC设计模式。如何在Scala中添加侦听器到Swing组件?

在Java中,我将通过添加ActionListener的按钮与控制器类听众做到这一点。在斯卡拉,我发现这非常困难。任何人都可以给我一些如何做到这一点的例子吗?

回答

12

你当然可以用和Java一样的方法来完成它。然而,使用Scala,您也可以使用Scala swing库来执行此操作,它提供了一组围绕Java Swing类的包装器。它使用publishersreactors的概念来观察事件并对事件做出反应。图书馆的设计介绍,包括样本,可以找到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库中定义的事件。在此示例中,表单只是将按钮事件重新发布到某个自定义的业务事件。控制器类依次监听表单,并以适当的方式对业务事件做出反应。

+0

获取我的投票,以获得质量与答案之间的最大对比! – 2011-06-07 08:30:42

+0

@Arjan谢谢你!这实际上是一个很好的回应,但它似乎并没有在我的项目上工作,因为我的控制器类和我的UI类都在分离的文件上,它也给了我在发布(事件)行的类型错误,我已经上传了我的项目这里:[链接](https://rapidshare.com/files/1639863150/rubik.rar)如果你可以看看,我将非常感激它..直到然后生病尝试使它工作..非常感谢! – oscar 2011-06-07 14:32:47

+0

@oscar:分离的文件不能有任何问题。从快速浏览代码看来,您可以从MainFrame类中调用publish(event)。您应该将该块移动到顶级RubikUI类,以使其正常工作。如果你只是在你的问题中发布了代码和错误信息(你仍然可以编辑它),这将有所帮助,因为这种方式使得给出一个适当的答案是一个相当长期的经验。 – 2011-06-07 17:09:13

相关问题