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);
}
}
誰かが間違っていることを理解するのを手伝ってもらえますか? これは特別な処理が必要な場合、レビューされたデータはモデルから取得されていませんか?
サンプルコードスニペットも問題ありません。
'isReviewedValue'はコンボで選択した値で変更されていますか? – SomeDude
はい。私はデバッグし、値は更新されています。 – user3540481
編集サポート内の 'getValue()'で 'isReviewedValue.getValue()'を返そうとしてください。 – SomeDude