0

я прохожу Tom Shindl's instructions о том, как добавить EMF привязки данных к таблицам, вот мой код для связывания данных:TableViewer с EMF привязки данных и ячейки редактирования - близко, но не совсем

protected DataBindingContext initDataBindings() { 

    //going to use this person instead 
    Person p = ProjectFactory.eINSTANCE.createPerson(); 
    p.setFirstName("tony"); 

    Committership c = ProjectFactory.eINSTANCE.createCommittership(); 
    c.setName("HELP"); 

    Committership anotherC = ProjectFactory.eINSTANCE.createCommittership(); 
    anotherC.setName("PELASE"); 

    Committership yetAnotherC = ProjectFactory.eINSTANCE.createCommittership(); 
    yetAnotherC.setName("EMERGENCY"); 

    p.getCommittership().add(c); 
    p.getCommittership().add(anotherC); 
    p.getCommittership().add(yetAnotherC); 

    CommandStack cs = new BasicCommandStack(); 
    AdapterFactory af = new ProjectItemProviderAdapterFactory(); 
    EditingDomain editingDomain = new AdapterFactoryEditingDomain(af, cs); 

    //data binding context 
    DataBindingContext bindingContext = new DataBindingContext(); 
    // 
    ObservableListContentProvider listContentProvider = new ObservableListContentProvider(); 
    IObservableMap[] attributeMap = new IObservableMap[1]; 
    attributeMap[0] = EMFEditProperties.value(
       editingDomain, 
       FeaturePath.fromList(ProjectPackage.Literals.COMMITTERSHIP__NAME) 
      ).observeDetail(listContentProvider.getKnownElements()); 

    TableViewerColumn column = new TableViewerColumn(tableViewer, SWT.NONE); 
    column.getColumn().setText("First Name"); 
    column.getColumn().setWidth(200); 
    column.setLabelProvider(new GenericMapCellLabelProvider("{0}", attributeMap)); 
    //tableViewer.setLabelProvider(new ObservableMapLabelProvider(attributeMap)); -- no need for this anymore 
    tableViewer.setContentProvider(listContentProvider); 

    //instead of giving it this list and doing it the non-EMF way 
    IObservableList selfList = Properties.selfList(Person.class).observe(p.getCommittership()); 

    //property that you are looking for 
    IListProperty prop = EMFEditProperties.list(editingDomain, ProjectPackage.Literals.PERSON__COMMITTERSHIP); 
    IObservableValue master = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTERSHIP__NAME) 
      .observe(p); 

    /**this should not be returning null, instead it should be a 
    * list of the values from the person committership EList 
    */ 
    IObservableList someList = prop.observeDetail(master); 

    //set input requires and IObservableList!! 
    tableViewer.setInput(someList); 
    // 
    return bindingContext; 
} 

нормально, теперь просто поговорить о том, что происходит и где я застрял.

эта линия здесь будет работать для данных JFace связывания: IObservableList selfList = Properties.selfList(Person.class).observe(p.getCommittership());

заселяет таблицу к счастью, это список, содержащий три человека, я добавил, приятно.

теперь делает его работу с EMF привязки данных, я пытаюсь это:

// свойство, которое вы ищете

IListProperty prop = EMFEditProperties.list(editingDomain, ProjectPackage.Literals.PERSON__COMMITTERSHIP); 
IObservableValue master = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTERSHIP__NAME) 
     .observe(p); 

/**this should not be returning null, instead it should be a 
* list of the values from the person committership EList 
*/ 
IObservableList someList = prop.observeDetail(master); 

проблема в том, что someList пуста, и, следовательно, он не будет таблица заполнить, может кто-нибудь объяснить, почему? Это определенно те три линии, которые имеют некоторую логическую проблему. То, что я действительно хочу это IObservableList наблюдаемых объектов EMF ...

помощь будет очень ценна, так как учебник Shindl не объясняет, где он делся мастер из ... Я думал, что я хотел бы создать мастер:

IObservableValue master = EMFEditProperties.value(editingDomain, ProjectPackage.Literals.COMMITTERSHIP__NAME) 
       .observe(p); 

и сделать prop.observeDetail(master)

, но она возвращается пустой список, как я уже говорил выше ... если бы только я мог бы по крайней мере, получить это сделать отображение данных, ближайший я пришел это имеет три клетки, но а не данные в них.

ответ

0
IObservableList listObservable = prop.observe(p); 
tableViewer.setInput(listObservable); 

Это фиксировало это для меня с точки зрения просмотра данных.

Что касается редактирования ячейки, я сделал это в конце концов:

public class CommittershipNameEditingSupport extends EditingSupport { 

    private static TableViewer tableViewer; 
    private final CellEditor editor; 

    public CommittershipNameEditingSupport(TableViewer tableViewer) { 
     super(tableViewer); 
     this.tableViewer = tableViewer; 
     this.editor = new TextCellEditor(tableViewer.getTable()); 
    } 

    @Override 
    protected CellEditor getCellEditor(Object element) { 
     return editor; 
    } 

    @Override 
    protected boolean canEdit(Object element) { 
     return true; 
    } 

    @Override 
    protected Object getValue(Object element) { 
     return ((Committership) element).getName(); 
    } 

    @Override 
    protected void setValue(Object element, Object value) { 
     ((Committership) element).setName(String.valueOf(value)); 
     tableViewer.update(element, null); 
    } 



} 

и в главном окне, где я craeted колонки я только что добавленный метод для редактирования ячейки поддержки ... это прекрасно работает прямо сейчас :)