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

2023-12-20

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

在 Java 中,我会通过添加一个ActionListener到控制器类中具有侦听器的按钮。在 Scala 中,我发现这非常困难。谁能给我一些如何做到这一点的例子?


当然,您可以按照与 Java 中完全相同的方式进行操作。然而,使用 Scala,您还可以使用 Scala swing 库来执行此操作,它提供了一组围绕 Java Swing 类的包装器。它使用的概念出版商 https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/swing/scala/swing/Publisher.scala and reactors https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/swing/scala/swing/Reactor.scala观察事件并做出反应。有关库设计的介绍,包括示例,可以找到here http://www.scala-lang.org/sites/default/files/sids/imaier/Mon,%202009-11-02,%2008:55/scala-swing-design.pdf.

The Publisher特质定义了一个publish(e: Event)方法通知所有已注册的反应器有关事件的信息。您可以通过简单地扩展此特征来使任何类成为发布者,并调用发布方法来发布您的事件。可以使用该方法注册一个reactordef 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 模式中使用它的想法。您可能还想查看测试包 https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src/swing/scala/swing/test这是库的一部分,您可以在其中找到许多示例。


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)
  }  
}

The listenTo(button1)表单中的方法将通知表单有关任何按钮事件的信息。在这种情况下,它将做出反应ButtonClickedevent,这是在 scala-swing 库中定义的事件。在此示例中,表单只是将按钮事件重新发布到某些自定义定义的业务事件。控制器类依次侦听表单,并可以以适当的方式对业务事件做出反应。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Scala 中向 Swing 组件添加监听器? 的相关文章

随机推荐