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

标签 swing scala actionlistener rubiks-cube

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

在 Java 中,我将通过向带有 Controller 类中的监听器的按钮添加 ActionListener 来实现此目的。在 Scala 中,我发现这非常困难。谁能给我一些如何做到这一点的例子?

最佳答案

当然,您可以使用与在 Java 中完全相同的方式来执行此操作。但是,使用 Scala,您也可以使用 Scala 摆动库来执行此操作,它提供了一组围绕 Java Swing 类的包装器。它使用 publishersreactors 的概念来观察和响应事件。可以在 here 中找到有关库设计的介绍,包括示例。
Publisher trait 定义了一个 publish(e: Event) 方法来通知所有注册的 Reactor 一个事件。您可以通过简单地扩展此特征来使任何类成为发布者,并调用 publish 方法来发布您的事件。 react 器可以使用 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 事件使用react,该事件是在 scala-swing 库中定义的一个事件。在此示例中,表单只是将按钮事件重新发布到某个自定义定义的业务事件。 Controller 类依次监听表单,并可以以适当的方式对业务事件使用react。

关于swing - 如何在 Scala 中向 Swing 组件添加监听器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6260387/

相关文章:

java - 动态按钮单击更新其他 JButton

scala - 为什么这个scala代码有编译错误类型不匹配

scala - 在 Scala 中运行处理 PApplet

swing - doClick 一个不可见的按钮

java - 创建 boolean 值以在选择正确的 JRadioButton 时显示 true

java - 检查 JTable 是否存在,如果存在则向其中添加行

java - 如何修复 JTable 中的列以使该列始终可见

java - 无法在我的图片上画出三角形

scala - SBT 不会解决对除 Typesafe 之外的任何存储库的传递依赖

Java - 作为方法或内部类或类?