簡體   English   中英

Akka應用程序的GUI

[英]GUI for Akka application

我在Akka上做了一個小型應用程序,該應用程序具有參與者的層次結構(有一個ActorA具有多個ActorB參與者,而這些ActorB參與者有多個ActorC參與者)。 現在,我想添加一個小的UI。 這個UI沒有任何按鈕,只有一些標簽,當ActorC角色從其他角色接收到某些消息時,這些標簽會被修改。 我的問題是我必須為每個ActorC演員創建一個標簽,但是(ActorC演員)的數量並不總是相同的,因此我必須首先創建ActorC演員,然后再創建標簽。 我搜索了有關Scala Swing的教程,但我只是發現了舊的文檔或簡單的示例,這些示例或案例對我的情況沒有用(類似於按下按鈕來執行操作)。 我什至看到有幾個人在其Akka應用程序中使用了Java Swing。 我找到了一個名為Kamon的工具,但我需要創建一個界面,而不僅僅是監視演員。 有沒有人可以幫助我?

不推薦使用Swing,而推薦使用JavaFX。 也就是說,JavaFX允許您創建“富客戶端”應用程序。 聽起來似乎太想解決您想要的問題了。

也許是簡單的Web UI? 您看過playframework.com嗎? 您的界面就是一些可以與演員對話的網頁。 Play和Akka可以很好地協同工作,並且可以使用可用的教程和模板輕松開始使用Play。

您的設計有兩個方面。 第一個方面是用戶界面和工作角色之間的溝通。 第二個是您的UI的操作。

一種情況是您的UI啟動並啟動Swing EDT線程以顯示您的狀態窗口。 還將創建一個演員,該演員與您的演員A接觸並說“准備出發”。 參與者A將消息轉發給所有參與者B,后者又將其轉發給參與者C。 然后,每個Actor C都會通過發送消息“我在這里”和“這是我的狀態”來向UI注冊自己。

def receive = {
  ...
  case ReadyToGo =>
    myMonitor = sender
    sender ! "ready"
}

UI-Actor獲取每個注冊消息並將其映射到標簽,並在需要時創建它。 當每個Actor C更改其狀態時,它都會向UI-Actor發送一條新消息,說“我還在這里”和“這是我的狀態”。

UI演員是Akka世界和UI之間的中間人。 這是棘手的部分,因為UI-Actor在與Swing事件分發線程不同的線程上運行。 它必須將任務放在Swing隊列中,以由Swing線程以線程安全的方式進行處理。 一些粗略的代碼:

// assume labelMap is a map from ActorRef to Label, ordered by insertion
def receive = {
  case IAmHere(status) =>
    val actorC = sender
    if ( ! (labelMap contains actorA) ) {
      addStatusLabel(actorC, status)
    }
  case IAmStillHere(status) =>
    updateStatusLabel(actorC, status)
}
def addStatusLabel(actorC: ActorRef, status: String) = {
  Swing.onEDT {
    labelMap(actorC) = new Label(status)
    // recalculate the panel size
    // repaint
  }
}
def updateStatusLabel(actorC: ActorRef, status: String) = {
  Swing.onEDT {
    labelMap(actorC).text = status
    // repaint
  }
}

我留給您布置用戶界面,容器,狀態是否為String ,如何處理丟失的Actor C等等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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