我目前正在開發Eclipse4 RCP應用程序,並嘗試獲取帶有兩列的JFace TableViewer,其中一列上有一個可選ComboBoxCellEditor。
一個大問題是:如果我從ComboBox中選擇一個值,那麼該列的標籤不會改變。如果我再次點擊組合框,它會顯示應顯示的值。
因此,例如,如果我可以選擇「Expr」和「String」並且當前選擇是「Expr」,如果從Combo中選擇「String」並單擊其他位置,組合仍然會顯示「Expr」。如果我再次點擊組合框並且它被聚焦,它會顯示「String」。如果我再次點擊其他地方,它仍然顯示「Expr」。
我使用幾個類來運行表。ComboBoxCellEditor不會更改標籤
我的模型類:
private String element;
private String type;
public TableModelElement(String element, String type) {
this.element = element;
this.type = type;
}
public TableModelElement(String element) {
this(element, SetTypeEnum.SET_TYPE_STRING.toString());
}
public TableModelElement() {
this("", SetTypeEnum.SET_TYPE_STRING.toString());
}
//And Getter/Setter
我SetTypeEnum:
public enum SetTypeEnum {
SET_TYPE_EXPR("expr"), SET_TYPE_STRING("string");
private final String setType;
private SetTypeEnum(String setType) {
this.setType = setType;
}
@Override
public String toString() {
return setType;
}
public static String[] toArray() {
String[] values = new String[SetTypeEnum.values().length];
int i = 0;
for (SetTypeEnum value : SetTypeEnum.values()) {
if (i < values.length) {
values[i] = value.toString();
i++;
}
}
return values;
}
}
的TableViewer的引發劑:
public class SetTable {
private TableViewer viewer;
private TableLayout layout;
private TableViewerColumn colElementText;
private TableViewerColumn colElementType;
public SetTable(Composite parent) {
layout = new TableLayout();
layout.addColumnData(new ColumnWeightData(3));
layout.addColumnData(new ColumnWeightData(1));
Table table = new Table(parent, SWT.BORDER | SWT.FULL_SELECTION
| SWT.V_SCROLL);
table.setLinesVisible(true);
table.setHeaderVisible(true);
table.setLayout(layout);
viewer = new TableViewer(table);
viewer.getControl().setLayoutData(
new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
colElementText = new TableViewerColumn(viewer, SWT.NONE);
colElementText.getColumn().setResizable(true);
colElementText.getColumn().setText("Wert");
colElementType = new TableViewerColumn(viewer, SWT.NONE);
colElementType.getColumn().setResizable(false);
colElementType.getColumn().setText("Typ");
EditingSupport exampleEditingSupport = new SetTableEditingSupport(
colElementType.getViewer());
colElementType.setEditingSupport(exampleEditingSupport);
viewer.setContentProvider(new ArrayContentProvider());
viewer.setLabelProvider(new SetTableLabelProvider());
TableModelElement[] model = new TableModelElement[] {
new TableModelElement("Test1",
SetTypeEnum.SET_TYPE_EXPR.toString()),
new TableModelElement("Test2",
SetTypeEnum.SET_TYPE_EXPR.toString()) };
viewer.setInput(model);
}
而且EditingSupport:
public class SetTableEditingSupport extends EditingSupport {
private ComboBoxViewerCellEditor cellEditor = null;
public SetTableEditingSupport(ColumnViewer colViewer) {
super(colViewer);
cellEditor = new ComboBoxViewerCellEditor((Composite) getViewer()
.getControl(), SWT.READ_ONLY);
cellEditor.setLabelProvider(new LabelProvider());
cellEditor.setContentProvider(new ArrayContentProvider());
cellEditor.setInput(SetTypeEnum.toArray());
}
@Override
protected CellEditor getCellEditor(final Object element) {
return cellEditor;
}
@Override
protected boolean canEdit(Object element) {
return true;
}
@Override
protected Object getValue(Object element) {
if (element instanceof TableModelElement) {
TableModelElement data = (TableModelElement) element;
return data.getType();
}
return null;
}
@Override
protected void setValue(Object element, Object type) {
if (element instanceof TableModelElement && type instanceof String) {
TableModelElement data = (TableModelElement) element;
String newType = (String) type;
/* only set new value if it differs from old one */
if (!data.getType().equals(newType)) {
data.setType(newType);
// String[] items =((CCombo)cellEditor.getControl()).getItems();
// for(int i=0;i<items.length;i++) {
// if(items[i].equalsIgnoreCase(newType)) {
// System.out.println("Will select Combo index i=" + i);
// ((CCombo)cellEditor.getControl()).select(i);
// }
// }
}
}
}
}
評論部分是我嘗試手動設置組合值的地方,但它不起作用。我認爲選定的值可能不是問題,就像我關注組合框一樣,顯示正確的值。我也試圖自定義LabelProvider添加到ComboBoxCellEditor但這也doesn't改變行爲(這是不令人驚訝,因爲標準的實現使用toString方法)