2011-01-21 27 views
7

Tôi hiện đang học Swing và tôi mới phát triển GUI nói chung. Trong ứng dụng thử nghiệm của tôi, tôi có nhiều người tham dự sự kiện cho một nguồn sự kiện duy nhất và tôi tự hỏi một trong những người nghe sự kiện này sẽ bị xử lý trước tiên.Java Swing Nhiều người nghe sự kiện cho một nguồn sự kiện duy nhất trong môi trường đơn luồng

Ngoài ra, tôi tò mò muốn biết cách xử lý sự kiện Swing hoạt động trong môi trường một luồng, đặc biệt là khi bạn có nhiều người nghe cho một nguồn sự kiện duy nhất.

Cuối cùng, tôi muốn biết một số trường hợp phổ biến mà tôi phải sử dụng nhiều luồng trong Swing.

Cảm ơn!

Trả lời

12

Tôi sẽ cố gắng trả lời tất cả 3 câu hỏi của bạn. Trước hết, thứ tự mà đám cháy ActionListener không được chỉ định. Người ta không bao giờ nên giả định một thứ tự cụ thể mà họ sẽ bắn. Nếu bạn cần hành động diễn ra theo một thứ tự cụ thể, hãy đặt chúng trong cùng một ActionListener.

Khi lập trình Swing, bạn sẽ 'gần như' luôn ở trong môi trường nhiều luồng. Có một luồng được gọi là Thread Dispatch Thread (EDT). Đây là luồng xử lý tất cả các sự kiện. Bất kỳ quá trình xử lý nào khác bạn nên thực hiện trên một luồng khác, nếu không giao diện Swing của bạn có thể không phản hồi.

Một trường hợp phổ biến cho nhiều luồng trong Swing là bất kỳ lúc nào bạn cần thực hiện một số quá trình xử lý mất một khoảng thời gian dài. (Tính toán cường độ cao, IO, kết nối cơ sở dữ liệu) Bạn sẽ muốn thực hiện công việc khó khăn trên một chuỗi riêng biệt từ EDT. Điều đó sẽ giữ cho GUI của bạn được đáp ứng.

Mạng Oracle có hướng dẫn tuyệt vời về đồng thời trong Swing. Tôi khuyên bạn nên check it out.

Một giao dịch lập trình Swing với các loại sau đây của chủ đề:

  • đề ban đầu, các chủ đề mà thực thi mã ứng dụng ban đầu.
  • Chuỗi gửi sự kiện, nơi tất cả mã xử lý sự kiện được thực hiện. Hầu hết các mã tương tác với khung công tác Swing cũng phải thực thi trên luồng này.
  • Chủ đề công nhân, còn được gọi là chủ đề nền, nơi thực hiện các tác vụ nền tốn thời gian.

Câu trả lời chuẩn cho mọi câu hỏi đa luồng trong Swing là sử dụng SwingWorker. Nó cho phép bạn dễ dàng phối hợp công việc nền trên một sợi riêng biệt với EDT. Như thường lệ, Oracle có great tutorial on how to use SwingWorker.

+1

Tôi bỏ lỡ một đề cập trực tiếp của SwingWorker, nhưng nếu không một câu trả lời rất tốt. – extraneon

+0

@extraneon: yes 'SwingWorker' là câu trả lời chuẩn cho đa luồng trong Swing. Tôi sẽ thêm một lời kêu gọi nhanh chóng vào nó ở cuối. – jjnguy

+2

Từ quan điểm thiết kế, có thể tạo một ActionListener để bạn có thể đăng ký các ActionListeners khác (hoặc một lớp khác) có thể thực hiện theo thứ tự chúng được thiết lập. – extraneon

Các vấn đề liên quan