Привязать данные и проверить TableViewer? - PullRequest
5 голосов
/ 29 июля 2010

Я использую инфраструктуру 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();

Ответы [ 3 ]

7 голосов
/ 13 августа 2010

Вам не нужно использовать JFace Databinding Framework в TableViewer. Управление структурированными данными проще, чем управление SWT, например 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()).

Однако, таблица, состоящая из множества столбцов, вам нужна LabelProvider, чтобы помочь вам сопоставить свойство модели с TableItem:

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

Все просто, но есть много шагов, чтобы сделать все вместе.

2 голосов
/ 10 декабря 2010

Использовать ViewerSupport:

TableViewer tableViewer = ...
IObservableList tableElements = ...
IValueProperty[] columnProperties = ...
ViewerSupport.bind(tableViewer, tableElements, columnProperties);
0 голосов
/ 05 января 2011

Я согласен с qualidafial.

Snippet017TableViewerWithDerivedColumns из jface.databinding фрагментов - полный пример этого.

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