2010-07-29 21 views
5

Bir SWT uygulamasında bazı Text alanlarını bağlamak için org.eclipse.core.databinding çerçevesini kullanıyorum. Bu kod parçası gerçekten iyi çalışıyorBir TableViewer'ı doğrulayın ve doğrulayın?

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); 

: Ben bir güncelleme stratejisi verileri doğrulamak için ve kullanıcı kaydetmek butonuna tıklayın yalnızca modeline değeri ekleyin.

Ama aynısını TableViewer'da nasıl yapabilirim?

bunu ben HİM şey eklediğinizde ben Sen TableViewer yılında JFace Veri bağlama Framework kullanan gerekmez getBindingContext().updateModels();

cevap

6

çağırana kadar, model değişmeden kalacak şekilde çalışmak istiyoruz. Yapılandırılmış verilerin manipülasyonu daha basittir, daha sonra SWT kontrolleri, örneğin TableViewer, ve TreeViewer. Aynı şekilde bu görüntüleyici kullanabilirsiniz: görüntüleyici oluşturmak

  • seti içerik sağlayıcı
  • seti etiket sağlayıcısı (önerilen)
  • set filtre (opsiyonel)
  • seti sıralayıcı (isteğe bağlı)

İzleyici oluşturulduktan sonra, tüm şeyleri görüntüleyicinize eklemek için viewer.setInput(data)'u çağırmanız yeterlidir.

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); 

sihirli içerik sağlayıcıya olur: Her model TableItem ve TableItem(item.getData()) modeli bir hale gelecektir

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 */ 

} 

modelinin bir listesi vardır.

Ancak, birçok sütunla oluşan bir tablo, sen LabelProviderTableItem için modelin özelliği haritalama size yardım etmek gerekir:

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 ""; 
    } 
} 

izleyiciye modellerin yayılma kolaydır. Görüntüleyiciyi ciltlenmiş modele iletecek olursanız, CellEditor'u da kullanabilirsiniz. CellEditor kullanmak için, TableViewer için sütun özelliklerini, hücre düzenleyicileri ve hücre değiştirici ayarlayabilirsiniz gerek:

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(); 
     } 
    } 
} 

Her şey basit ama yapmak için birçok adım vardır:

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

CellModifier bunu beğendi birlikte.

+1

Tam bir kod var: http://pastie.org/1089932 – qrtt1

+0

Bu kod için çok teşekkürler. Gerçekten yararlı! – flumins

+8

... ama neden veri tabanından vazgeçmek ve çok sayıda kod yazması için geri dönmek istesin? – vwegert

2

Kullanım ViewerSupport:

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

Bu iyi bir çözüm gibi görünüyor. Bununla birlikte, doğrulayıcıları ve dönüştürücüleri bir tablo görüntüleyiciyle birlikte kullanmanın bir yolu var mı? – Lii

0

i qualidafial katılıyorum.jface.databinding snippet'lerinden gelen

Snippet017TableViewerWithDerivedColumns, bunun tam bir örneğidir.

+0

Snippet artık mevcut görünmüyor. İşte bir alternatif: http://wiki.eclipse.org/JFace_Data_Binding/Snippets#Viewers – paul

İlgili konular