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);
}
}
아무도 잘못 될지 이해하는 데 도움을 줄 수 있습니까? 검토 된 데이터가 모델에 포함되지 않았으므로 이에 대한 특별한 처리가 필요합니까?
샘플 코드 스 니펫도 좋습니다.
'isReviewedValue'가 콤보에서 선택한 값으로 수정 되었습니까? – SomeDude
예. 내가 디버깅하고 가치가 업데이 트되고 있습니다. – user3540481
편집 지원 내에서 getValue() 함수에서'isReviewedValue.getValue()'를 반환 해보십시오. – SomeDude