2010-05-13 39 views
9

SwingWorker được sử dụng cho các mục đích sau:Java - Sự khác nhau giữa SwingWorker và SwingUtilities.invokeLater()

  • Ví chạy nhiệm vụ lâu dài trong một chủ đề khác nhau để ngăn chặn sự GUI từ việc không đáp ứng
  • Để cập nhật GUI với kết quả được tạo bởi tác vụ dài hạn ở cuối nhiệm vụ thông qua phương thức done().
  • Để cập nhật GUI theo thời gian với kết quả trung gian được tạo và xuất bản bởi tác vụ với sự trợ giúp của các phương thức publish()process().

SwingUtilities.invokeLater() có thể thực hiện các nhiệm vụ trên như sau:

  • Thay vì thực hiện phương pháp SwingWorker.execute() từ EDT, chúng ta có thể thực hiện ExecutorService.submit(new MyRunnable()) vì nó cũng sẽ tạo ra một thread mà có thể thực hiện nhiệm vụ kéo dài.
  • Để cập nhật GUI khi kết thúc tác vụ, chúng tôi có thể đặt mã (được viết theo phương thức done() của case1) SwingUtilites.invokeLater(new RunnableToExecuteDoneMethodCode()) ở cuối tác vụ.
  • Để cập nhật GUI ở giữa nhiệm vụ, chúng tôi có thể đặt mã (viết bằng process() phương pháp case1) SwingUtilites.invokeLater(new RunnableToExecuteProcessMethodCode()) tại nơi chúng tôi gọi phương thức publish() trong trường hợp 1.

Tôi hỏi câu hỏi này vì vấn đề nêu trong câu hỏi Java - SwingWorker - Can we call one SwingWorker from other SwingWorker instead of EDT có thể được giải quyết bằng cách SwingUtilities.invokeLater() nhưng không thể được giải quyết với SwingWorker

+1

Tôi không hoàn toàn chắc chắn về 'câu hỏi' là. – akf

+0

@akf nếu bạn không chắc chắn, sau đó rời khỏi nó. Đơn giản :) –

+0

Sự cố bạn đề cập đến có thể giải quyết được bằng cách sử dụng SwingWorker. Xem câu trả lời của tôi ở đó. –

Trả lời

6

SwingWorker là một lớp helper - nó không phải là bạn cần phải sử dụng nó, nhưng việc sử dụng nó đơn giản và rõ ràng hơn nhiều so với thực hiện cùng một công việc bằng tay. (Nó cũng làm cho tiến trình kiểm tra dễ dàng hơn.) Lưu ý rằng nó đã được thêm vào phiên bản 6 - trước đó một số người sử dụng một lớp đơn giản được định nghĩa trong Hướng dẫn Swing hoặc đã làm tương tự như những gì bạn đã chú ý.

+0

+1 Thuận tiện, có một cổng tương thích ngược cho Java 5. https://swingworker.dev.java.net/ – trashgod

1

Một tính năng quan trọng của lớp 1.6+ SwingWorker là sự khác biệt giữa sự kiện() và sự kiện() của doInBackground() và done(). Bạn nên nghĩ về doInBackground() như doWorkOutsideEDT() và done() như doWorkInsideEDT(). Chạy ví dụ hướng dẫn này để xem ví dụ khác.

System.out.println("TID=" + Thread.currentThread().getId() + " (main)"); 
    final SwingWorker<String, String> x = new SwingWorker<String, String>() { 
     @Override 
     protected String doInBackground() throws Exception { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + " doInBackground() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("Long running code goes here."); 
      return ""; 
     } 

     @Override 
     protected void done() { 
      final long tid = Thread.currentThread().getId(); 
      System.out.println(""); 
      System.out.println("TID=" + tid + "   done() isEventDispatchThread=" + SwingUtilities.isEventDispatchThread()); 
      System.out.println("GUI updates/changes go here."); 
     } 
    }; 
    x.execute(); 
    x.get(); 

Output:

TID=1 (main) 

TID=9 doInBackground() isEventDispatchThread=false 
Long running code goes here. 

TID=16   done() isEventDispatchThread=true 
GUI updates/changes go here. 
Các vấn đề liên quan