如何在Scala中向Swing组件添加侦听器?

时间:2011-06-07 03:44:48

标签: swing scala actionlistener rubiks-cube

我正在尝试在Rubik的立方体Scala应用程序中实现MVC设计模式。

在Java中,我会通过在控制器类中使用侦听器向按钮添加ActionListener来实现此目的。在斯卡拉,我发现这非常困难。谁能给我一些如何做到这一点的例子?

1 个答案:

答案 0 :(得分:12)

您当然可以使用与Java相同的方式完成此操作。但是,使用Scala,您还可以使用Scala swing库来执行此操作,它提供了一组围绕Java Swing类的包装器。它使用publishersreactors的概念来观察事件并做出反应。可以找到关于图书馆设计的介绍,包括样本,here

Publisher特征定义了publish(e: Event)方法,以通知所有已注册的反应堆有关事件的信息。您可以通过简单地扩展此特征使任何类成为发布者,并调用publish方法来发布您的事件。可以使用方法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模式中使用它。另外,您可能需要查看库中的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库中定义的事件。在此示例中,表单只是将按钮事件重新发布到某个自定义的业务事件。控制器类依次监听表单,并以适当的方式对业务事件做出反应。