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