2012-01-24 38 views
7

Có thể điều này là tầm thường, tôi đang cố gắng để hiểu một tài liệu đơn giản trên SwingWorker.java SwingWorker.doInBackground() không được truy cập các phần tử GUI

Dưới đây là bản sao dán nội dung

Workflow

Có ba chủ đề liên quan đến vòng đời của một SwingWorker:

chủ đề: Chỉ số thực hiện() phương pháp được gọi là về vấn đề này chủ đề. Nó lịch trình SwingWorker để thực hiện trên một sợi công nhân và trả về ngay lập tức. Người ta có thể đợi cho SwingWorker hoàn thành bằng cách sử dụng các phương pháp nhận .

Chủ đề công việc: Phương thức doInBackground() được gọi trên chuỗi này. Đây là nơi tất cả các hoạt động nền sẽ diễn ra. Để thông báo PropertyChangeListeners về các thay đổi thuộc tính bị ràng buộc sử dụng các phương thức firePropertyChange và getPropertyChangeSupport(). Theo mặc định có hai thuộc tính ràng buộc có sẵn: trạng thái và tiến trình.

Sự kiện công văn Chủ đề: Tất cả các hoạt động liên quan đến Swing xảy ra trên chủ đề này . SwingWorker gọi phương thức và các phương thức done() và thông báo cho bất kỳ PropertyChangeListeners nào về chủ đề này.

Thông thường, chuỗi hiện tại là Chủ đề công văn sự kiện.

-

Các sợi nhân viên không phải là EDT, do đó các mã trong doInBackground() không phải truy cập vào các yếu tố GUI. Tôi hiểu có đúng không?

Bối cảnh: Chúng tôi có mã nhỏ sử dụng SwingWorker nhưng có doInBackground() tạo FileChooser và gọi setCurrentDirectory(). Tôi nghi ngờ điều đó dẫn đến ngoại lệ cho tôi gần giống như http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6637181 (11-Closed, Not a Defect)

Trả lời

11

Có. Từ một chuỗi nền - cả hai chủ đề thông thường và SwingWorker.doInBackground bạn không được sửa đổi giao diện người dùng để tránh nhiều sự cố khác nhau.

Thay vào đó, quấn những thay đổi trong một Runnable và họ đã thực hiện trong EDT qua SwingUtilities.invokeAndWait, SwingUtilities.invokeLater hoặc - khi sử dụng SwingWorker - qua publish (từ doInBackground). Trong phương thức process của SwingWorker, được thực thi bởi EDT, bạn có thể truy cập GUI.

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

Cá nhân, tôi tìm invokeLaterinvokeAndWait dễ dàng hơn để sử dụng cho nhiều tình huống. SwingWorker không sao, ví dụ: thanh tiến trình.

+0

Cảm ơn- chúng tôi làm những gì bạn đã viết để trả lời hầu như tất cả các địa điểm. Có một số khu vực nơi mã sử dụng swingworker. Ngay cả trong trường hợp đó, việc xử lý có thể được chia thành phần truy cập GUI và phần không phải gui. – Jayan

+0

Làm việc chia quyền sẽ thường tăng hiệu suất và tránh các vấn đề, vì vậy chúng tôi thực sự khuyên bạn nên sử dụng. –

+0

@Jayan hướng dẫn nói về đầu ra từ xuất bản/quá trình/thực hiện, bạn có thể kiểm tra xem if (isEventDispatchThread) vui lòng đọc http://stackoverflow.com/questions/7053865/cant-get-arrayindexoutofboundsexception-from-future-and-swingworker- nếu-threa. +1 – mKorbel

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