簡體   English   中英

如何在 Scala 中的 Swing 組件中添加監聽器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM