2013-07-11 5 views
5

में एक सूची बाध्यकारी डेटा के लिए सर्वोत्तम अभ्यास मुझे अपने ग्रहण आरसीपी आवेदन में डेटाबेस को समझने में परेशानी हो रही है। मैं बस को समझ नहीं सकता कि यह कैसे काम करने के लिए चाहिए था ..ग्रहण आरसीपी आवेदन

यहाँ है कि मैं क्या

मैं एक दृश्य जहां ग्रंथों की एक सूची प्रदर्शित किया जाना चाहिए है क्या करना चाहते है। ग्रंथों को एक साधारण List<String> में "संग्रहीत" किया जाता है जो एकलटन के माध्यम से प्रदान किया जाता है (केवल प्रदर्शन उद्देश्य के लिए;))। तो जो भी ListProvider का उपयोग करता है उसे ग्रंथों की सूची मिल जाएगी। जब सूची बदलती है तो मैं चाहता हूं कि मेरा दृश्य तालिका सामग्री को स्वचालित रूप से अपडेट कर दे।

यहाँ मैं अब तक

मेरी सूची प्रदाता क्या किया है एक Observable कि पर्यवेक्षकों को सूचित करेंगे जब सूची में परिवर्तन है।

मेरे विचार में मैं सूची प्रदाता को देखने के लिए पर्यवेक्षक बनाता हूं और जब पर्यवेक्षक को अधिसूचित किया जाता है तो मैं अपना विचार रीफ्रेश करता हूं। देखने के लिए

public class ListProvider extends Observable { 

    private Stack<String> hist; 
    private static ListProvider instance; 

    // Singleton implementation 
    public static ListProvidergetInstance() { 
     if (null == instance) { 
      instance = new ListProvider 
     } 
     return instance; 
    } 

    public void add(String text) { 
     if (this.hist.size() == MAX_SIZE) { 
      this.hist.remove(MAX_SIZE-1); 
     } 
     this.hist.add(0, text); 
     // notify all observers 
     this.setChanged(); 
     this.notifyObservers(); 
    } 
} 

कोड:: ListProvider के लिए

कोड

public class TestView extends ViewPart { 

private TableViewer viewer; 

[...] 

class ViewContentProvider implements IStructuredContentProvider { 
    public void inputChanged(Viewer v, Object oldInput, Object newInput) { 
    } 
    public void dispose() { 
    } 
    public Object[] getElements(Object parent) { 
     return ClipboardHistory.getInstance().getList().toArray(); 
    } 
} 

public void createPartControl(Composite parent) { 
    viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 
    IContentProvider contentProvider = new ViewContentProvider(); 
    viewer.setContentProvider(contentProvider); 
    viewer.setLabelProvider(new ViewLabelProvider()); 
    viewer.setInput(getViewSite()); 

    Observer listObserver = new Observer() { 
     @Override 
     public void update(Observable o, Object arg) { 
      // update the table viewer 
      viewer.refresh(); 
     } 
    }; 

    ListProvider.getInstance().addObserver(listObserver); 
} 
} 

प्रश्न

Observer और Observable "सही" जिस तरह से उपयोग कर रहा है जा सकते हैं या मैं कर रहा हूँ करने के लिए कुछ भूल रहा हूं? मुझे यकीन नहीं है कि मैंने आरसीपी डाटाबेसिंग की अवधारणा को समझ लिया है ...

+0

मुझे आपकी सूची में आइटमों के दायरे के बारे में निश्चित नहीं है, लेकिन क्या आपने एक सरल एसडब्ल्यूटी सूची (http://help.eclipse.org/juno/index.jsp?topic=%2Forg.eclipse.platform जोड़ने) पर विचार किया है .doc.isv% 2Freference% 2Fapi% 2Forg% 2Feclipse% 2Fswt% 2Fwidgets% 2FList।एचटीएमएल) टेबलव्यूर इत्यादि के बजाय आपके दृश्य पर ऑब्जेक्ट – nbz

+0

यह भी एक सूची व्यूअर (http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.platform.doc का उपयोग करना बेहतर हो सकता है। आईएसवी% 2 फ़्रीफर% 2 फ़ैपी% 2 फ़ोरग% 2 फ़्लेक्लीप्स% 2 फ़ेज़फ़ेस% 2 फ़्यूवरर्स% 2FListViewer.html) एक टेबल व्यूअर के बजाय। – nbz

+0

इनपुट के लिए धन्यवाद। फिलहाल यह केवल एक सूची है लेकिन मैं बाद में अन्य कॉलम में अधिक डेटा जोड़ना चाहता हूं। सूची सूची का उपयोग करने के तरीके को सूची में बदलने के तरीके का उपयोग करना होगा? – Friederike

उत्तर

5

मैं तुम्हें JFace Databinding पढ़ने और ViewerSupport, ObservableListContentProvider का इस्तेमाल करते हैं और सलाह देते हैं नौकरी को सरल बनाने के लिए BeanProperties

तुम भी एक संदर्भ है, जहां बाध्यकारी ViewerSupport की मदद से पिछले पर किया जाता है के लिए एक काम उदाहरण JFace Databinding Snippet: Model to TableViewer binding देख सकते हैं:

(...) 
TableViewer peopleViewer = new TableViewer(committers); 
ViewerSupport.bind(peopleViewer, new WritableList(viewModel.getPeople(), 
    Person.class), BeanProperties.value(Person.class, "name")); 
उन सहायकों के साथ

आप के लिए Observer को लागू करने की जरूरत नहीं होगी आपकी सूची, और यदि आप अपने दर्शक को संशोधित करते समय अपने लेबल अपडेट करना चाहते हैं तो PropertyChangeSupport पर एक ही उदाहरण में एक नज़र डालें, जो आपको उस सूची के किसी भी तत्व पर प्रत्येक परिवर्तन पर दर्शक को रीफ्रेश करने की अनुमति देता है जिसे आप इसके माध्यम से सूचित करते हैं। यह महत्वपूर्ण है कि आप बाध्यकारी के लिए BeanProperties का उपयोग करें।

+0

यह एक अच्छा समाधान की तरह लगता है। लेकिन क्या इसका उपयोग कर तालिका दर्शक के साथ वैधकर्ताओं और कन्वर्टर्स का उपयोग करने का कोई तरीका है? – Lii

1

मुझे नहीं लगता कि एक संभावित अपवाद के साथ आपके दृष्टिकोण में कुछ भी गलत है। आपको यह सुनिश्चित करना है कि दर्शक यूआई सूत्र में ताज़ा किया जाता है बनाने की जरूरत है:

Display.getDefault().asyncExec(new Runnable() { 
    @Override 
    public void run() { 
     viewer.refresh(); 
    } 
}); 

लेकिन वहाँ चीजें हैं जो आप तालिका अद्यतन और अधिक कुशल बनाने के लिए कर सकते हैं। अपने कोड में यह केवल तालिका के शीर्ष पर एक आइटम जोड़ने के लिए प्रकट होता है, तो आप के लिए एक कॉल के साथ बेहतर होगा ऊपर:

viewer.insert(text, 0); 
+0

यूआई थ्रेड पर नोट के लिए धन्यवाद। 'viewer.insert' के साथ अनुकूलन के लिए मुझे नहीं लगता कि यह अधिक कुशल है। मुझे यकीन नहीं है कि मेरे मॉडल में कौन से बदलाव किए गए थे। इसलिए मुझे अपडेट/आवेषण/हटाना जांचना होगा। पूरी सूची को फिर से प्राप्त करने और इसे प्रदर्शित करने की तुलना में यह अधिक महंगा है। ;) – Friederike

संबंधित मुद्दे