Как добавить слушателей к компонентам Swing в Scala? - PullRequest
4 голосов
/ 07 июня 2011

Я пытаюсь реализовать шаблон проектирования MVC в Scala-приложении Rubik cube.

В Java я бы сделал это, добавив ActionListener к кнопкам со слушателями в классе контроллера.В Scala я обнаружил, что это чрезвычайно сложно.Кто-нибудь может дать мне несколько примеров, как это сделать?

1 Ответ

12 голосов
/ 07 июня 2011

Конечно, вы можете сделать это точно так же, как в Java. Однако, используя Scala, вы также можете использовать для этого библиотеку Scala swing, которая предоставляет набор оболочек для классов Java Swing. Он использует концепции издателей и реакторов для наблюдения и реагирования на события. Ознакомление с дизайном библиотеки, включая образцы, можно найти здесь .

Черта 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. Также вы можете попробовать тестовый пакет , который является частью библиотеки, где вы можете найти несколько примеров.


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. В этом примере форма просто повторно публикует событие кнопки в каком-либо настраиваемом бизнес-событии. Класс контроллера, в свою очередь, слушает форму и может соответствующим образом реагировать на бизнес-событие.

...