मेरी "समस्या" निम्नलिखित द्वारा वर्णित की जा सकती है। मान लें कि हमारे पास एक गहन प्रक्रिया है जिसे हम पृष्ठभूमि में चलाना चाहते हैं और इसे स्विंग जेपी प्रोग्रेस बार अपडेट करना है। समाधान आसान है:स्विंगवर्कर के अन्य तरीकों से प्रकाशित करने के लिए कैसे
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);
}
}
अब मान लें कि मेरे पास लंबे समय तक कई विधियां हैं। उदाहरण के लिए हमारे पास एक तरीका है जो सर्वर से फ़ाइल डाउनलोड करता है। या कोई अन्य जो सर्वर पर अपलोड करता है। या वास्तव में कुछ भी। उन तरीकों से प्रकाशित विधि को प्रस्तुत करने का सही तरीका क्या है ताकि वे उचित रूप से जीयूआई अपडेट कर सकें?
मैं अब तक क्या पाया है यह है (मान लेते हैं कि विधि "aMethod" उदाहरण के लिए कुछ अन्य पैकेज में रहता है):
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();
}
}
}
}
यह काम करता है, लेकिन मैं यह कुछ का अभाव है पता है। कोई विचार?
क्या होगा यदि हमारे पास केवल एक भयानक लंबी विधि है? मैं डाउनवॉटिंग नहीं कर रहा हूं, लेकिन यह समाधान नहीं है – Xorty
यदि मेरा उत्तर खराब है तो आप डाउनवोटिंग कर सकते हैं। लेकिन मैंने सवाल में पढ़ा "उदाहरण के लिए हमारे पास एक तरीका है जो किसी सर्वर से फ़ाइल डाउनलोड करता है या कोई अन्य जो सर्वर पर अपलोड करता है। या वास्तव में कुछ भी।" ... तो मुझे लगता है कि बहुत सारी विधियां हैं, न केवल एक भयानक लंबा ? – Istao
मेरी समस्या यह है कि कोड के विभिन्न हिस्सों से इन विधियों को बुलाया जा सकता है। और गुई तत्व को ताज़ा करने की आवश्यकता होगी, वह हमेशा एक जैसा नहीं होगा। मेरे समाधान के साथ मैं एक सामान्य विधि बना सकता हूं और हर बार जब मैं एक नया स्विंगवर्कर बनाता हूं तो मैं अपने गुई पर प्रक्रिया विधि का आकलन कर सकता हूं। –