2016-07-18 4 views
0

I 4 개의 열이있는 테이블이 있습니다. 참조 ID, 질문, 범주 및 검토 됨. RefrenceId, Question 카테고리는 일반 텍스트이며, Reviewed는 예 또는 공백 값으로 드롭 다운됩니다.콤보 뷰어 선택 데이터로 테이블의 열 셀 업데이트 JFace

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

     } 
    } 

아무도 잘못 될지 이해하는 데 도움을 줄 수 있습니까? 검토 된 데이터가 모델에 포함되지 않았으므로 이에 대한 특별한 처리가 필요합니까?

샘플 코드 스 니펫도 좋습니다.

+0

'isReviewedValue'가 콤보에서 선택한 값으로 수정 되었습니까? – SomeDude

+0

예. 내가 디버깅하고 가치가 업데이 트되고 있습니다. – user3540481

+0

편집 지원 내에서 getValue() 함수에서'isReviewedValue.getValue()'를 반환 해보십시오. – SomeDude

답변

0

combo의 getValue() 및 setValue()는 string 대신 정수 값을 사용해야합니다. getValue() 메서드에서 문자열 배열의 값의 인덱스를 반환하고 setValue()에서 값의 인덱스를 설정합니다. 아마도 '가치'에서 int 값을 얻게 될 것입니다. 디버그를 시도하십시오. 문자열 값이 array의 값 색인을 찾으면. 및

isReviewedValue.select (index);