[英]How to add listeners to Swing components in Scala?
我正在嘗試在魔方 Scala 應用程序中實現 MVC 設計模式。
在 Java 中,我將通過在 controller class 中的偵聽器的按鈕上添加一個ActionListener
來做到這一點。 在 Scala 中,我發現這非常困難。 誰能給我一些如何做到這一點的例子?
您當然可以按照與 Java 中完全相同的方式進行操作。 Using Scala however, you can also use the Scala swing library to do this, which provides a set of wrappers around the Java Swing classes. 它使用發布者和反應器的概念來觀察和響應事件。 可以在此處找到有關庫設計的介紹,包括示例。
Publisher
trait 定義了一個publish(e: Event)
方法來通知所有注冊的 Reactors 一個事件。 您可以通過簡單地擴展此 trait 使任何 class 成為發布者,並調用 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 模式中使用它的想法。 此外,您可能想查看測試 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 庫中定義的事件。 在此示例中,表單只是將按鈕事件重新發布到某個自定義的業務事件。 controller class 依次偵聽表格,並可以以適當的方式對業務事件作出反應。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.