2016-07-18 4 views
0

I 4列の表があります。 ReferenceID、Question、Category、およびReviewedを参照してください。 RefrenceId、Questionカテゴリは通常のテキストであり、Reviewedは「はい」または空白の値でドロップダウンされています。コンボビューアで選択されたデータで表の列セルを更新するJFace

RefrenceId、Question、Categoryは、QuestionTypeというモデルオブジェクトから値を取得します。

これは常に固定値です。はい、モデルオブジェクトからのブランクではありません。

私はTabelビューア、作成された列、別のセルエディタを追加しました。また、レビュー列のサポートを編集しました。

これまでのデータはすべての列に来ています。私はどんな選択を見直し列を選択した場合でも、値が選択したセルに表示されていません

以下

私のコードは

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

}

編集

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

列を作成するコードですサポートクラスは以下のようになります

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

コンボのgetValue()およびsetValue()は、stringの代わりに整数値を使用する必要があります。 getValue()メソッドから文字列配列の値のインデックスを返し、setValue()で値のインデックスを設定します。おそらくあなたはそこからint値を 'value'から得るでしょう。デバッグしてみてください。 その文字列の値がarrayの値のインデックスを見つけたら。および

isReviewedValue.select(index);

関連する問題