Ich schreibe eine kleine Anwendung in Scala. Die Anwendung verarbeitet einfache Protokolldateien. Da die Verarbeitung einige Zeit in Anspruch nimmt, habe ich beschlossen, meinen Anwendungskern Actor erweitern zu lassen.Interaktion mit Schauspielern in Scala Swing-Anwendungen
class Application extends Actor {
def react() {
loop {
react {
case Process(file) => // do something interesting with file...
}
}
}
}
Die Verarbeitung einer Protokolldatei wird durch Klicken auf eine Schaltfläche in der GUI ausgelöst. Die GUI verwendet Scala Swing.
Nun muss der Anwendungskern die GUI über den aktuellen Fortschritt benachrichtigen.
sender ! Progress(value) // whenever progress is made
Ich habe dies gelöst, indem ich einen separaten Akteur in der GUI erstellt habe. Der Darsteller wird innerhalb des Edt-Threads ausgeführt. Er hört Nachrichten vom Anwendungskern ab und aktualisiert die GUI.
object Gui extends SimpleSwingApplication {
val actor = new Actor {
override val scheduler = new SchedulerAdapter {
def execute(fun: => Unit) { Swing.onEDT(fun) }
}
start()
def act() {
loop {
react {
case ForwardToApplication(message) => application ! message
case Progress(value) => progressBar.value = value
}
}
}
}
}
Da der Anwendungskern muss über den Absender der Nachricht wissen, verwende ich diese Schauspieler auch Nachrichten von der GUI der Anwendung Kern zu übermitteln, meine Schauspieler den neuen Sender zu machen.
reactions += {
case ButtonClicked(`startButton`) => actor ! ForwardToApplication(Process(file))
}
Dieser Code funktioniert einwandfrei. Meine Frage: Gibt es einen einfacheren Weg dies zu tun? Es wäre nett, den Reaktionsmechanismus für meine Anwendungsnachrichten einfach zu verwenden:
Irgendwelche Ideen, wie man das erreicht?
Ich denke, es ist eine gute Lösung. Vielleicht verdiente ich eine Gegenleistung im Gegenzug;) – gerferra
Ich glaube, Sie vermissen "Vermittler!" In Ihrer Reaktion auf "ButtonClicked" – gerferra
@geferra Der 'intermediator!' Aufruf ist im Konstruktor der 'Fallklasse Send'. Der "Vermittler" wird durch einen impliziten Parameter übergeben. Ich erhebe Ihre Antwort, da sie meine eigene Lösung inspiriert hat. –