2010-02-18 5 views
5

मुझे आश्चर्य है कि SwingWorker को मेरे मुख्य जीयूआई में घोंसला वाला वर्ग होना है। मैं अपने किसी भी प्रोग्राम तर्क से जीयूआई को स्पष्ट रखने के लिए इसे बाहरी कक्षा बनाना चाहता हूं।क्या स्विंगवर्कर को घोंसला वाला वर्ग होना चाहिए?

मैंने SwingWorker कक्षा बाहरी बनाने की कोशिश की, जो प्रक्रिया के लिए ठीक काम करता है, दुर्भाग्य से मैं स्विंगवर्कर वर्ग से अपने किसी भी जीयूआई फ़ील्ड तक नहीं पहुंच सकता। जब भी मैं किसी विशेषता को एक्सेस करने का प्रयास करता हूं, जैसे लेबल या स्विंगवर्कर के done() विधि से जो भी हो, मुझे एक nullPointer अपवाद मिलता है।

कोई सलाह बहुत सराहना की जाएगी!


सबसे पहले धन्यवाद जेफ! अब तक ठीक काम करता है, भले ही मैं आपके द्वारा प्रस्तुत दूसरे विकल्प पर आपका अनुसरण नहीं कर सका। मेरे पृष्ठभूमि कार्यों में से एक एक निश्चित आकार (लंबी मान) की गणना करता है, इसलिए मेरे जीयूआई से वह मूल्य प्राप्त करना अच्छा लगेगा।

आपने गेटर्स और सेटर्स के साथ काम करने का सुझाव दिया लेकिन दुर्भाग्य से मुझे यह नहीं पता कि स्विंगवर्कर वर्ग में उन्हें कैसे कार्यान्वित किया जाए।

मैं इसे इस तरह की कोशिश की:

public void setSize(long totalSize) { 
    this.totalSize = totalSize; 
} 
public long getTotalSize() { 
    return totalSize; 
} 

सेटर doInBackground() विधि के अंत में शुरू हो जाती है। दुर्भाग्य से मैं अपने जीयूआई से get() विधि का उपयोग नहीं कर सकता।

final MySwingWorker w = new MySwingWorker(); 
Runnable r = new Runnable() { 
    public void run() { 
     // do something with w.get() 
    } 
}; 
w.setRunnable(r); 
w.execute(); 

"डब्ल्यू" की वस्तु निर्माण मेरे मामले में काम नहीं करता है के रूप में निर्माता Runnable की एक वस्तु की आवश्यकता है। क्या मुझे कुछ याद आ रही है? कृपया मेरे लिए आसान हो जाएं, यह पहली बार है जब मैं स्विंगवर्कर के साथ काम करता हूं। :) फिर, आपकी मदद के लिए बहुत बहुत धन्यवाद!

उत्तर

6

आप स्विंगवर्कर को बाहरी कक्षा बना सकते हैं। हालांकि, किसी भी अन्य वर्ग की तरह, यदि यह चर नहीं देख सकता (उदा। लेबल जिसे आप सेट करना चाहते हैं), निश्चित रूप से यह इसे सेट करने में सक्षम नहीं होगा। एक चीज जो आप कर सकते हैं वह कार्यकर्ता को एक रननेबल पास कर देता है जो इसे पूर्ण होने पर निष्पादित करता है।

public class MySwingWorker extends SwingWorker { 

    private final Runnable r; 
    public MySwingWorker(Runnable r) { 
     this.r = r; 
    } 
    public void doInBackground() {...} 
    public void done() { r.run(); } 
} 

अब जीयूआई से, आप की तरह

Runnable updateLabel = new Runnable() { 
     public void run() { 
      label.setText("myValue"); 
     } 
}; 
SwingWorker w = new MySwingWorker(updateLabel); 
w.execute(); 

यह थोड़ा जटिल काम हो जाता है आप, SwingWorker का परिणाम उपयोग करना चाहते हैं हालांकि यह संभव है कुछ करना हो सकता है। बल्कि स्विंग कार्यकर्ता निर्माता को Runnable गुजर से, आप एक सेटर विधि है और की तरह कुछ तो यह होगा होगा:

final MySwingWorker w = new MySwingWorker(); 
Runnable r = new Runnable() { 
    public void run() { 
     // do something with w.get() 
    } 
}; 
w.setRunnable(r); 
w.execute(); 

या तो मामले में, Runnable को बंद करने कि निष्पादित किया जाता है की तरह ही कार्य कर रहा है जब कार्यकर्ता समाप्त हो गया है।

+0

रननेबल के बजाय निर्माता को केवल लेबल में पास करना भी संभव होगा। प्रत्येक छोटी कार्रवाई के लिए एक नए कार्यकर्ता उप-वर्ग को परिभाषित करना शायद अधिक होगा। बेनामी कक्षाएं एक बहुत छोटी, कसकर युग्मित वस्तु को एक साथ रखने की इस विशेष समस्या को हल करने के लिए बहुत अच्छी हैं। –

+0

यह वास्तव में निर्भर करता है कि यह एक एकल उपयोग केस है। अमूर्त कार्य करता है यदि आप इसे कई स्थानों पर कर रहे हैं। ओह कैसे बंद मददगार होगा। –