2013-02-13 18 views
7

Tôi có nhân viên xoay để tính toán trong nền, trong khi cập nhật tiến trình trong một JFrame.Làm thế nào để chờ cho đến khi một SwingWorker hoàn tất?

Làm cách nào để chủ đề chính của tôi đợi cho doInBackground() kết thúc?

Tôi biết tôi có thể đặt mọi thứ trong phương thức done(), nhưng tôi đã tự hỏi nếu có một cách để thực sự làm cho chương trình chờ đợi (thread đó, để được chính xác).

Điều gì đó tương tự như những gì một JDialog phương thức sẽ làm.

Vậy ...

SwingWorker a = new SwingWorker(); 
a.execute 

doOtherStuff(); 

doOtherStuff đang chạy chỉ sau doInBackground hoàn tất, nhưng không đưa phương pháp nói trong phương pháp thực hiện() của SwingWorker.

+0

Một SwingWorker đại diện cho một hoạt động "không đồng bộ". Với mô hình này, điều "tiếp theo" cần làm được xử lý trong một cuộc gọi lại - nếu không, sử dụng nó như một nguồn sự kiện không đồng bộ sẽ mua ít. JDialogs hacks awful mình .. không phải cái gì tôi muốn khuyên bạn nên cố gắng để thi đua. –

Trả lời

9

Câu trả lời ngắn gọn là có.

SwingWorker#get sẽ chặn cho đến khi phương thức trả về doInBackground.

Câu trả lời dài là, có lẽ không phải những gì bạn muốn làm.

Nếu bạn khởi chạy SwingWorker từ EDT và gọi SwingWorker#get, bạn sẽ chặn EDT, ngăn không cho xử lý bất kỳ cập nhật nào dẫn bạn trở lại lý do bạn sử dụng SwingWorker.

Trong trường hợp này, bạn có hai lựa chọn. Bạn có thể cung cấp SwingWorker với giao diện gọi lại, mà nó có thể gọi từ done sau khi hoàn thành SwingWorker. Hoặc bạn có thể đính kèm một PropertyChangeListener vào SwingWorker và theo dõi giá trị state, đợi cho đến khi nó bằng StateValue.Done