2010-11-02 24 views
5

Ứng dụng Swing của chúng tôi thực hiện một số tác vụ chạy dài trong chuỗi nền bằng cách sử dụng lớp SwingWorker tuyệt vời. Tuy nhiên, rất nhiều máy Mac cũ chỉ hỗ trợ Java 5, vì vậy chúng tôi muốn biên dịch ứng dụng của chúng tôi là 5 thay vì 6. Vì SwingWorker đã được giới thiệu trong Java 6, chúng tôi không thể sử dụng nó nữa.Java 5 SwingWorker thay thế

Sau đây có phải là một sự thay thế có thể chấp nhận được nếu tôi chỉ cần làm điều gì đó trong nền và sau đó truyền đạt nó trong GUI khi hoàn thành? Hay tôi quên thứ gì đó quan trọng?

public static void wannabeSwingWorker(final Runnable doInBackground, final Runnable callback) { 
    Thread backgroundThread = new Thread(new Runnable() { 
     public void run() { 
      doInBackground.run(); 
      SwingUtilities.invokeLater(callback); 
     } 
    }); 
    backgroundThread.start(); 
} 

Trả lời

10

tôi sẽ cho bình luận khác một người nào đó về sự phù hợp của mã của bạn, nhưng như một sự thay thế, bạn có thể tải về một backport của SwingWorker để sử dụng trong Java 5 here.

+0

Trên thực tế, nó eppears rằng đây là việc thực hiện ban đầu của SwingWorker, và rằng Sun đã chuyển nó vào thư viện chuẩn. –

3

Mã của bạn nên hoạt động chính xác; tất nhiên bạn sẽ mất tất cả các tính năng khác của SwingWorker (trả về một phần kết quả và tiến độ, bị hủy, hỗ trợ người nghe),

1

Nếu bạn không gặp bất kỳ vấn đề nào với mã LGPL trong sản phẩm của mình, bạn có thể sử dụng backport phiên bản của SwingWorker Java 5.

http://java.net/projects/swingworker

2

Hãy xem Foxtrot, mà làm việc khác biệt so với hầu hết các libs Swing đồng thời.

Thay vì kích hoạt chuỗi nền để thực hiện tác vụ dài, nó mô phỏng cách tiếp cận do Swing thực hiện khi bạn hiển thị hộp thoại phương thức bằng cách thực hiện tác vụ dài trên Swing EDT và kích hoạt chuỗi mới để xử lý Sự kiện GUI.

Khi làm việc với tác vụ chạy dài trả về giá trị mà bạn cần hành động ngay lập tức, kết quả là một đoạn mã chương trình rất đẹp, thủ tục/không đồng thời (chính xác như kiểm tra giá trị trả về từ JOptionPane.showConfirmDialog(...)) .

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