2014-10-31 100 views
0

我目前正在開發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方法)

回答

1

在編輯支持setValue方法調用:

getViewer().update(element, null); 

將這個呼叫後:

data.setType(newType); 

這告訴它需要更新從內容提供商的元素表查看器。