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
.
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
@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
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