से jProgressBar अद्यतन मैं प्रोग्रेसबार अपडेट करके लंबे समय तक चलने वाले कार्य की निगरानी करने के लिए उपयोग करता हूं। लंबे समय तक चलने वाला कार्य निश्चित रूप से स्विंगवर्कर थ्रेड में किया जाता है।स्विंगवर्कर
मुझे लगता है कि जैसी चीजों के कार्यक्रम के लिए इस्तेमाल किया:
public class MySwingWorkerClass extends SwingWorker<Void, Void> {
private JProgressBar progressBar;
public MySwingWorker(JProgressBar aProgressBar) {
this.progressBar = aProgressBar;
progressBar.setVisible(true);
progressBar.setStringPainted(true);
progressBar.setValue(0);
}
@Override
public Void doInBackground() {
//long running task
loop {
calculation();
progressBar.setValue(value);
}
return null;
}
@Override
public void done() {
progressBar.setValue(100);
progressBar.setStringPainted(false);
progressBar.setVisible(false);
}
}
लेकिन हाल ही में मुझे पता चला कि मैं इसे "setProgress" का उपयोग कर और संपत्ति परिवर्तन को परिभाषित करते हुए करते हैं और कि
public class MySwingWorkerClass extends SwingWorker<Void, Void> {
private JProgressBar progressBar;
public MySwingWorker(JProgressBar aProgressBar) {
addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent evt) {
if ("progress".equals(evt.getPropertyName())) {
progressBar.setValue((Integer) evt.getNewValue());
}
}
});
progressBar.setVisible(true);
progressBar.setStringPainted(true);
progressBar.setValue(0);
setProgress(0);
}
@Override
public Void doInBackground() {
//long running task
loop {
calculation();
setProgress(value);
}
return null;
}
@Override
public void done() {
setProgress(100);
progressBar.setValue(100);
progressBar.setStringPainted(false);
progressBar.setVisible(false);
}
}
तरह बातें कर सकता है
मेरा सवाल है: क्या मेरा पहला कोड स्वीकार्य है या क्या मैं किसी भी सत्र के लिए सेट प्रोग्रेस का उपयोग करूंगा? मुझे दूसरा कोड अधिक जटिल लगता है और मेरे मामले में और यह नहीं पता कि दूसरे का उपयोग करने का कोई फायदा या कारण है या नहीं।
कोई सलाह?
EDIT उत्तर के लिए धन्यवाद। एक सारांश के रूप में। पहला समाधान "गलत" है क्योंकि प्रगति बार अद्यतन ईडीटी के बाहर किया जाता है। दूसरा समाधान "सही" है क्योंकि प्रगति बार अपडेट ईडीटी
के अंदर किया गया है, अब मेरे मामले में @mKorbel के "रोचक" उत्तर के अनुसार मेरी गणना HTML पाठ में परिणाम देती है जिसे मैं "सम्मिलित करता हूं" (देखें this link)। मेरा वर्तमान कोड निम्नलिखित है।
मैं प्रकाशित (स्ट्रिंग) और मेरे प्रक्रिया कोड कि
@Override
protected void process(List<String> strings) {
for (String s : strings) {
try {
htmlDoc.insertBeforeEnd(htmlDoc.getElement(htmlDoc.getDefaultRootElement(), StyleConstants.NameAttribute, HTML.Tag.TABLE), s);
} catch (BadLocationException ex) {
} catch (IOException ex) {
}
}
}
मैं @mKobel मेरे मामले में भी ऐसा ही करने को पुन: उपयोग कर सकते हैं की तरह लग रहा है। मेरा मतलब है कि वह मेरे मामले में टेबल प्रतिपादन को ओवरराइड करने के लिए उपयोग करता है, मैं किस रेंडरर को ओवरराइड (jTextPane?) और कैसे?
मुझे लगता है कि आपका दूसरा दृष्टिकोण भी गलत है। आप मान सेट करने के लिए श्रोता का उपयोग कर रहे हैं, जो श्रोता को बुलाएगा, जो मूल्य निर्धारित करेगा, जो श्रोता इत्यादि का आह्वान करेगा आदि। मुझे यकीन नहीं है कि यह वास्तव में होगा, लेकिन यह गलत लगता है। इस तरह, आपको स्विंगवर्कर का लाभ नहीं मिल रहा है, आप अभी भी ईडीटी में प्रगति पट्टी का मूल्य निर्धारित कर रहे हैं। –
['स्विंगवर्कर.publish (वी ...)'] (http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html#publish%28V...%29) "प्रक्रिया विधि के अंदर * इवेंट डिस्पैच थ्रेड * पर प्रसंस्करण के लिए मध्यवर्ती परिणाम देने के लिए 'doInBackground' विधि के अंदर से इस विधि का उपयोग किया जाना चाहिए।" –
@ एंड्रयू थॉम्पसन: मैं प्रकाशन को "प्रकाशित" परिणामों में उपयोग करता हूं लेकिन यहां http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html प्रोग्रेसबार मान सेट करने के लिए वे सेट प्रोग्रेस का उपयोग करते हैं और प्रकाशित नहीं है, तो? – HpTerm