2010-07-29 15 views
5

मैं org.eclipse.core.databinding फ्रेमवर्क का उपयोग कुछ Text फ़ील्ड को एक SWT एप्लिकेशन में बांधने के लिए करता हूं।डाटाबेस और एक टेबल व्यूअर मान्य करें?

UpdateValueStrategy toModel = new UpdateValueStrategy(UpdateValueStrategy.POLICY_CONVERT); 
    if (validator != null) { 
     toModel.setAfterGetValidator(validator); 
    } 

    UpdateValueStrategy fromModel = new UpdateValueStrategy(UpdateValueStrategy.POLICY_UPDATE); 

    binding = bindingContext.bindValue(SWTObservables.observeText(this, SWT.Modify), 
        BeansObservables.observeValue(pVO, propertyName), toModel, fromModel); 

कोड का यह टुकड़ा वास्तव में अच्छी तरह से काम करता है: मैं एक अद्यतन रणनीति डेटा मान्य करने के लिए और उपयोगकर्ता को बचाने के बटन पर क्लिक करें केवल जब मॉडल पर मूल्य निर्धारित करने के लिए जोड़ें।

लेकिन मैं TableViewer पर ऐसा कैसे कर सकता हूं?

मैं यह इतना काम करने के लिए कि जब मैं IHM में कुछ जोड़ने, मॉडल अपरिवर्तित रहने जब तक मैं getBindingContext().updateModels();

उत्तर

6

फोन आप TableViewer में JFace Databinding फ्रेमवर्क का उपयोग की जरूरत नहीं करना चाहती। संरचित डेटा कुशलतापूर्वक एसडब्ल्यूटी नियंत्रण, TableViewer, ListViewer और TreeViewer के बाद आसान है। आप एक ही तरह से उन व्यूअर का उपयोग कर सकते हैं:

  • दर्शक बनाने
  • सेट सामग्री प्रदाता
  • सेट लेबल प्रदाता (सुझाव)
  • सेट फिल्टर (वैकल्पिक)
  • सेट सॉर्टर (वैकल्पिक)

दर्शक के निर्माण के बाद, सभी चीजों को अपने दर्शकों को रखने के लिए बस viewer.setInput(data) पर जाएं।

TableViewer tableViewer = new TableViewer(parent); 

Table table = tableViewer.getTable(); 
table.setHeaderVisible(true);  
table.setLinesVisible(true);` 

for (int i = 0; i < COLUMN_NAMES.length; i++) { 
    TableColumn tableColumn = new TableColumn(table, SWT.LEFT); 
    tableColumn.setText(COLUMN_NAMES[i]); 
    tableColumn.setWidth(COLUMN_WIDTHS[i]); 
} 

tableViewer.setContentProvider(new ModelContentProvider()); 
tableViewer.setLabelProvider(new ModelLabelProvider()); 
tableViewer.setInput(models); 

जादू सामग्री प्रदाता में क्या होता है:

class ModelContentProvider implements IStructuredContentProvider { 

    @SuppressWarnings("unchecked") 
    @Override 
    public Object[] getElements(Object inputElement) { 
     // The inputElement comes from view.setInput() 
     if (inputElement instanceof List) { 
      List models = (List) inputElement; 
      return models.toArray(); 
     } 
     return new Object[0]; 
    } 

/* ... other methods */ 

} 

प्रत्येक मॉडल एक TableItem और TableItem(item.getData()) में मॉडल बन जाएगा

मॉडल की एक सूची नहीं है।

हालांकि, कई कॉलम द्वारा रचित एक मेज, आप LabelProviderTableItem करने के लिए मॉडल की संपत्ति मानचित्रण आपकी मदद की जरूरत है:

class ModelLabelProvider extends LabelProvider implements 
     ITableLabelProvider { 

    @Override 
    public Image getColumnImage(Object element, int columnIndex) { 
     // no image to show 
     return null; 
    } 

    @Override 
    public String getColumnText(Object element, int columnIndex) { 
     // each element comes from the ContentProvider.getElements(Object) 
     if (!(element instanceof Model)) { 
      return ""; 
     } 
     Model model = (Model) element; 
     switch (columnIndex) { 
     case 0: 
      return model.getFoo(); 
     case 1: 
      return model.getBar(); 
     default: 
      break; 
     } 
     return ""; 
    } 
} 

दर्शक को मॉडल के प्रसार आसान है। यदि आप CellEditor का उपयोग करके बाध्य मॉडल पर दर्शक प्रसारित करेंगे, तो यह भी सरल है। CellEditor का उपयोग करने के लिए आपको TableViewer करने के लिए स्तंभ गुण, सेल संपादक और सेल संशोधक सेट की जरूरत है:

tableViewer.setColumnProperties(COLUMNS_PROPERTIES); 
tableViewer.setCellEditors(new CellEditor[] { 
     new TextCellEditor(table), new TextCellEditor(table) }); 
tableViewer.setCellModifier(new ModelCellModifier(tableViewer)); 

CellModifier पसंद करती है यह:

class ModelCellModifier implements ICellModifier { 
    TableViewer viewer; 

    public ModelCellModifier(TableViewer viewer) { 
     this.viewer = viewer; 
    } 

    @Override 
    public boolean canModify(Object element, String property) { 
     // property is defined by viewer.setColumnProperties() 
     // allow the FOO column can be modified. 
     return "foo_prop".equals(property); 
    } 

    @Override 
    public Object getValue(Object element, String property) { 
     if ("foo_prop".equals(property)) { 
      return ((Model) element).getFoo(); 
     } 
     if ("bar_prop".equals(property)) { 
      return ((Model) element).getBar(); 
     } 
     return ""; 
    } 

    @Override 
    public void modify(Object element, String property, Object value) { 
     if ("foo_prop".equals(property)) { 
      TableItem item = (TableItem) element; 
      ((Model) item.getData()).setFoo("" + value); 

      // refresh the viewer to show the changes to our user. 
      viewer.refresh(); 
     } 
    } 
} 

सब कुछ सरल है लेकिन वहाँ सभी बनाने के लिए कई कदम उठाए जाते हैं साथ में।

+1

एक पूरा कोड है: http://pastie.org/1089932 – qrtt1

+0

इस कोड के लिए बहुत बहुत धन्यवाद। वास्तव में उपयोगी! – flumins

+8

... लेकिन आप डाटाबेसिंग पर क्यों छोड़ना चाहते हैं और बॉयलरप्लेट कोड लिखने के लिए वापस लौटना चाहते हैं? – vwegert

2

उपयोग ViewerSupport:

TableViewer tableViewer = ... 
IObservableList tableElements = ... 
IValueProperty[] columnProperties = ... 
ViewerSupport.bind(tableViewer, tableElements, columnProperties); 
+0

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

0

मैं qualidafial से सहमत हैं।

Snippet017TableViewerWithDerivedColumnsjface.databinding स्निपेट से इसका एक संपूर्ण उदाहरण है।

+0

स्निपेट अब और उपलब्ध नहीं प्रतीत होता है। यहां एक विकल्प दिया गया है: http://wiki.eclipse.org/JFace_Data_Binding/Snippets#Viewers – paul

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