Tôi đang viết một ứng dụng nhỏ trong scala. Ứng dụng xử lý các tệp nhật ký đơn giản. Bởi vì việc xử lý mất một thời gian, tôi đã quyết định để cho lõi ứng dụng của tôi mở rộng Diễn viên.Tương tác với các diễn viên trong các ứng dụng scala swing
class Application extends Actor {
def react() {
loop {
react {
case Process(file) => // do something interesting with file...
}
}
}
}
Việc xử lý tệp nhật ký được kích hoạt bằng cách nhấp vào nút trong gui. Các gui sử dụng scala swing.
object Gui extends SimpleSwingApplication {
val application = new Application().start()
def top = new MainFrame {
val startButton = new Button
reactions += {
case ButtonClicked(`startButton`) => application ! Process(file)
}
}
}
Bây giờ, lõi ứng dụng cần thông báo cho gui về tiến trình hiện tại.
sender ! Progress(value) // whenever progress is made
Tôi đã giải quyết vấn đề này bằng cách tạo một diễn viên riêng bên trong gui. Các diễn viên được thực hiện bên trong chủ đề edt. Nó lắng nghe thông điệp từ lõi ứng dụng và cập nhật 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
}
}
}
}
}
Kể từ khi lõi ứng dụng cần phải biết về người gửi tin nhắn, tôi cũng sử dụng diễn viên này để chuyển tiếp các tin nhắn từ gui cho lõi đơn, làm diễn viên của tôi người gửi mới.
reactions += {
case ButtonClicked(`startButton`) => actor ! ForwardToApplication(Process(file))
}
Mã này chỉ hoạt động tốt. Câu hỏi của tôi: Có cách nào đơn giản hơn để làm điều này không? Thật tuyệt vời khi sử dụng đơn giản cơ chế phản ứng cho thông điệp ứng dụng của tôi:
reactions += {
case Progress(value) => progressBar.value = value
}
Bất kỳ ý tưởng nào để đạt được điều này?
Tôi nghĩ đó là một giải pháp tốt. Có lẽ tôi xứng đáng nhận được một upvote trong trở lại;) – gerferra
Tôi nghĩ rằng bạn đang thiếu 'trung gian!' Trong phản ứng của bạn với 'ButtonClicked' – gerferra
@geferra Cuộc gọi' trung gian 'bên trong hàm tạo 'trường hợp gửi Send'. 'Trung gian' được truyền qua một tham số ngầm định. Tôi đang upvoting câu trả lời của bạn vì nó cung cấp nguồn cảm hứng cho giải pháp của riêng tôi. –