"Sự cố" của tôi có thể được mô tả bằng cách sau. Giả sử chúng tôi có một quá trình chuyên sâu mà chúng tôi muốn chạy trong nền và cập nhật thanh Swing JProgress. Giải pháp rất dễ dàng:Cách ủy quyền xuất bản của SwingWorker cho các phương thức khác
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
/**
* @author Savvas Dalkitsis
*/
public class Test {
public static void main(String[] args) {
final JProgressBar progressBar = new JProgressBar(0,99);
SwingWorker<Void, Integer> w = new SwingWorker<Void, Integer>(){
@Override
protected void process(List<Integer> chunks) {
progressBar.setValue(chunks.get(chunks.size()-1));
}
@Override
protected Void doInBackground() throws Exception {
for (int i=0;i<100;i++) {
publish(i);
Thread.sleep(300);
}
return null;
}
};
w.execute();
JOptionPane.showOptionDialog(null,
new Object[] { "Process", progressBar }, "Process",
JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
null, null, null);
}
}
Bây giờ giả sử rằng tôi có nhiều phương pháp mất nhiều thời gian. Ví dụ, chúng tôi có một phương pháp tải một tập tin từ một máy chủ. Hoặc cách khác tải lên máy chủ. Hoặc bất cứ điều gì thực sự. Cách thích hợp để ủy quyền phương thức xuất bản cho các phương thức đó để chúng có thể cập nhật GUI một cách thích hợp là gì?
gì tôi đã tìm thấy cho đến nay là thế này (giả định rằng phương pháp "aMethod" cư trú trong một số gói khác ví dụ):
import java.awt.event.ActionEvent;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;
import javax.swing.SwingWorker;
/**
* @author Savvas Dalkitsis
*/
public class Test {
public static void main(String[] args) {
final JProgressBar progressBar = new JProgressBar(0,99);
SwingWorker<Void, Integer> w = new SwingWorker<Void, Integer>(){
@Override
protected void process(List<Integer> chunks) {
progressBar.setValue(chunks.get(chunks.size()-1));
}
@SuppressWarnings("serial")
@Override
protected Void doInBackground() throws Exception {
aMethod(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
publish((Integer)getValue("progress"));
}
});
return null;
}
};
w.execute();
JOptionPane.showOptionDialog(null,
new Object[] { "Process", progressBar }, "Process",
JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE,
null, null, null);
}
public static void aMethod (Action action) {
for (int i=0;i<100;i++) {
action.putValue("progress", i);
action.actionPerformed(null);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Nó hoạt động nhưng tôi biết nó thiếu cái gì đó. Có suy nghĩ gì không?
nếu chúng ta chỉ có một phương pháp dài khủng khiếp thì sao? Tôi không downvoting, nhưng đây không phải là một giải pháp – Xorty
Bạn có thể downvoting nếu câu trả lời của tôi là xấu. Nhưng tôi đọc trong câu hỏi "Ví dụ chúng tôi có một phương pháp tải một tập tin từ một máy chủ. Hoặc một cái khác tải lên máy chủ. Hoặc bất cứ điều gì thực sự." ... vì vậy tôi cho rằng có rất nhiều phương pháp, không chỉ là một Dài ? – Istao
Vấn đề tôi có là những phương pháp này có thể được gọi từ các phần khác nhau của mã. Và yếu tố gui họ sẽ cần phải làm mới sẽ không phải lúc nào cũng giống nhau. Với giải pháp của tôi tôi có thể tạo ra một phương pháp chung và mỗi lần tôi tạo ra một swingworker mới tôi có thể assing phương pháp xử lý trên gui của tôi. –