2016-09-15 8 views
0

Eclipse SWT에서 테이블 뷰어를 사용하여 하나의 세 번째 열에서만 특히 콤보 상자를 생성합니다. 내가 다음 코드를 컴파일 할 때어설 션 실패 : 알 수없는 열 레이아웃 데이터

내가 지금까지 확인 모든 일을했다고 생각하지만 내가 얻을 오류 :

Error Msg

코드 :

public void createPartControl(Composite parent) { 

    Composite tableComposite = new Composite(parent, SWT.NONE); 
    tableColumnLayout = new TableColumnLayout(); 
    tableComposite.setLayout(tableColumnLayout); 
    tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, 
      true)); 

    tableViewer = new TableViewer(tableComposite, SWT.MULTI | SWT.H_SCROLL 
      | SWT.V_SCROLL); 
    tableViewer.setContentProvider(ArrayContentProvider.getInstance()); 
    // TODO viewer.setLabelProvider(new ViewLabelProvider()); 
    table = tableViewer.getTable(); 
    // Table table = tableViewer.getTable(); 
    table.setHeaderVisible(true); 
    table.setLinesVisible(true); 

    String[] titles = { "Threat Name", "Category Name", "Status", 
      "Priority", "Description", "Justification" }; 
    int[] bounds = { 100, 100, 100, 100 }; 
    TableViewerColumn col = createTableViewerColumn(titles[2], bounds[2], 2); 
    col.setLabelProvider(new ColumnLabelProvider() { 
     @Override 
     public String getText(Object element) { 
      Dummy p = (Dummy) element; 
      return p.getValue(); 
     } 
    }); 
    col.setEditingSupport(new FirstValueEditingSupport(tableViewer)); 

} 


private SelectionAdapter getSelectionAdapter(final TableColumn column, 
     final int index) { 
    SelectionAdapter selectionAdapter = new SelectionAdapter() { 
     @Override 
     public void widgetSelected(SelectionEvent e) { 
      tableViewer.refresh(); 
     } 
    }; 
    return selectionAdapter; 
} 

private static class Dummy { 
    public String value; 

    public Dummy(String value) { 
     this.value = value; 
    } 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 
} 

public static class FirstValueEditingSupport extends EditingSupport { 

    private final TableViewer viewer; 
    private final CellEditor editor; 

    private final String[] possibleValues = { "Mitigated", 
      "Not Applicable", "Not Started", "Needs Investigation" }; 

    public FirstValueEditingSupport(TableViewer viewer) { 
     super(viewer); 
     this.viewer = viewer; 
     this.editor = new ComboBoxCellEditor(viewer.getTable(), 
       possibleValues); 
    } 

    @Override 
    protected CellEditor getCellEditor(Object element) { 
     return editor; 
    } 

    @Override 
    protected boolean canEdit(Object element) { 
     return true; 
    } 

    @Override 
    protected Object getValue(Object element) { 
     Dummy dummy = (Dummy) element; 

     int index = 0; 

     for (int i = 0; i < possibleValues.length; i++) { 
      if (Objects.equals(possibleValues[i], dummy.getValue())) { 
       index = i; 
       break; 
      } 
     } 

     return index; 
    } 

    @Override 
    protected void setValue(Object element, Object value) { 
     Dummy dummy = (Dummy) element; 

     int index = (Integer) value; 

     dummy.setValue(possibleValues[index]); 

     viewer.update(element, null); 
    } 
} 

private void fillRows(String shortdesc, String categ, String descp) { 
    System.out.println("fillRows call from above method."); 
    TableColumn status_Name_Col = tableViewer.getTable().getColumn(2); 
    System.out.println("**************** status_Name_Col ************ " 
      + status_Name_Col); 

    tableViewer 
      .addSelectionChangedListener(new ISelectionChangedListener() { 
       @Override 
       public void selectionChanged(
         SelectionChangedEvent selectionChangedEvent) { 
        StructuredSelection selection = (StructuredSelection) selectionChangedEvent 
          .getSelection(); 
        System.out.println(((Dummy) selection.getFirstElement()) 
          .getValue()); 
       } 
      }); 

    List<Dummy> elements = new ArrayList<>(); 
    for (int i = 0; i < Connection.Number_Of_Connection; i++) { 
     elements.add(new Dummy("First option")); 
    } 
    tableViewer.setInput(elements); 
    tableColumnLayout.setColumnData(status_Name_Col, new ColumnWeightData(
      1, true)); 
    tableViewerColumn.setEditingSupport(new FirstValueEditingSupport(
      tableViewer)); 
} 

질문 : 어떻게 표시 콤보 상자 특히 하나의 열에?

답변

0

을 설정하기 전까지는 TableViewer전화를해서는 안됩니다. setInput이 호출되기 전에 모든 컨텐츠 공급자, 레이블 공급자, 열 레이아웃, 편집 지원 등이 설정되어야합니다.

작성한 모든 열마다 setColumnData이라고도 호출해야합니다.

+0

setInput을 setEditingSupport 아래로 이동합니다. 동일한 오류가 발생했습니다. –

+0

생성 한 모든 열에서'setColumnData'를 호출해야합니다.이 작업을 수행했는지 여부는 코드에서 알 수 없습니다. –

+0

@ greg-449 : 감사합니다. –