Обновление ячейки столбца таблицы с помощью комбинированного средства просмотра выбранных данных JFace

java swt jface

523 просмотра

1 ответ

104 Репутация автора

У меня есть таблица с 4 столбцами. ReferenceID, вопрос, категория и отзывы. RefrenceId, Category Question - это обычные тексты, а Reviewed - это выпадающий список с да или пустым значением.

RefrenceId, Question, Category получает значение из модельного объекта с именем QuestionType.

Для проверяемого всегда установлено фиксированное значение Да, Пустое не из объекта модели.

Я создал средство просмотра таблиц, создал столбцы, добавил различные редакторы ячеек, а также редактировал поддержку столбца обзора.

До сих пор поступают данные по всем колонкам. Но когда я выбираю проверенный столбец с любым выбором, значение не появляется в выбранной ячейке

Ниже мой код

private void createCheckListTableUI(Composite parent) {
checkListTableViewer = new TableViewer(tableContainer, SWT.RESIZE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.SINGLE);
    checkListTableViewer.setContentProvider(new ObservableSetContentProvider());
    checkListTableViewer.getTable().setHeaderVisible(true);
    checkListTableViewer.getTable().setLinesVisible(true);
    TableColumnLayout tcl = new TableColumnLayout();
    createColumnsForCheckListTable(checkListTableViewer, tcl);
    CellEditor[] editors = new CellEditor[4];
    editors[0] = new TextCellEditor(checkListTableViewer.getTable());
    editors[1] = new TextCellEditor(checkListTableViewer.getTable());
    editors[2] = new TextCellEditor(checkListTableViewer.getTable());        
    editors[3] = new ComboBoxCellEditor(parent, reviewed, SWT.DROP_DOWN);        
    checkListTableViewer.setCellEditors(editors);
    checkListTableViewer.setInput(checkListModel.getAvailableQuestList());
    tableContainer.setLayoutData(GridDataFactory.fillDefaults().grab(true, true).align(SWT.FILL, SWT.FILL).span(3, 30).create());
    tableContainer.setLayout(tcl);
}

Код создания колонки

private void createColumnsForCheckListTable(TableViewer checkListTableViewer, TableColumnLayout tcl) {
  //RefID
    TableViewerColumn refIdColumn = createColumn(checkListTableViewer, Constants.CHECKLIST_REFID, 80);
    tcl.setColumnData(refIdColumn.getColumn(), new ColumnWeightData(80));
    refIdColumn.setLabelProvider(new ColumnLabelProvider() {
        @Override
        public String getText(Object element) {
            if (element instanceof QuestionType) {
                QuestionType question = (QuestionType) element;
                return question.getRefID();
            }
            return element.toString();
        }
    });
   ...

TableViewerColumn reviewedColumn = createColumn(checkListTableViewer, Constants.CHECKLIST_REVIEWED, 80);
    ReviewColumnEditorSupport revColEditing = new ReviewColumnEditorSupport(reviewedColumn.getViewer(),checkListModel.getReviewedVal());
    reviewedColumn.setEditingSupport(revColEditing);
    tcl.setColumnData(reviewedColumn.getColumn(), new ColumnWeightData(90));
    reviewedColumn.setLabelProvider(new CellLabelProvider() {
        @Override
        public void update(ViewerCell cell) {
            if(cell.getElement() instanceof String) {
                cell.setText(((String) cell.getElement()));
            }
        }
    });

}

Класс поддержки редактирования выглядит ниже

public final class ReviewColumnEditorSupport  extends EditingSupport {
    private String[] reviewed = {"","yes","No"};
    private ComboBoxViewerCellEditor cellEditor = null;
    private WritableValue isReviewedValue;

    public ReviewColumnEditorSupport(ColumnViewer viewer, WritableValue isReviewedValue) {
        super(viewer);
        this.isReviewedValue = isReviewedValue;
        cellEditor = new ComboBoxViewerCellEditor((Composite) getViewer().getControl(), SWT.READ_ONLY);
        cellEditor.setLabelProvider(new LabelProvider());
        cellEditor.setContentProvider(new ArrayContentProvider());
        cellEditor.setInput(reviewed);
        cellEditor.addListener(new ICellEditorListener() {

            @Override
            public void editorValueChanged(boolean oldValidState, boolean newValidState) {
                // TODO Auto-generated method stub

            }

            @Override
            public void cancelEditor() {
                // TODO Auto-generated method stub

            }

            @Override
            public void applyEditorValue() {
                CCombo combo =  (CCombo) cellEditor.getControl();
                isReviewedValue.setValue(combo.getText());
            }
        });

    }

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

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

    @Override
    protected Object getValue(Object element) {

        if (element instanceof QuestionType) {
            CCombo combo =  (CCombo) cellEditor.getControl();
            return combo.getText();
        }
        return null;
    }

    @Override
    protected void setValue(Object element, Object value) {
        if (element instanceof QuestionType && value instanceof String) {
          //  CCombo combo =  (CCombo) cellEditor.getControl();
            getViewer().update(value, null);
            isReviewedValue.setValue((String)value);

        }
    }

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

Пример кода также хорошо.

Автор: user3540481 Источник Размещён: 18.07.2016 07:36

Ответы (1)


0 плюса

142 Репутация автора

getValue () и setValue () для комбо должны использовать целочисленное значение вместо строки. Возвращает индекс значения в строковом массиве из метода getValue (), а в setValue () устанавливает индекс значения. Вероятно, вы получите там значение int из 'value'. Попробуйте отладить. если его строковое значение, найдите индекс значения в массиве. а также

isReviewedValue.select (индекс);

Автор: Abhishek Tiwari Размещён: 02.08.2016 06:08
Вопросы из категории :
32x32