2011-09-06 39 views
0

里面我有一个TableViewer一个GridLayout内。一切正常,表格查看器显示为白色区域,其中包含一些数据。 问题是,白色区域非常高,但几乎没有宽度。我没有找到任何可能性来设置此查看器的大小。如何调整TableViewer的大小的网格布局

我是否需要以某种方式调整布局?我找不到如何!该TableViewer似乎没有任何填补其细胞...

什么想法?

回答

5

我卷绕使用类来自动调节基于所述数据的TableViewer的宽度。

下面是我如何使用类:

activeViewer = new TableViewer(parent, 
      SWT.H_SCROLL | SWT.V_SCROLL | SWT.SINGLE | SWT.FULL_SELECTION); 
    final Table activeTable = activeViewer.getTable(); 

    AutoResizeTableLayout layout = new AutoResizeTableLayout(activeTable); 
    activeTable.setLayout(layout); 

    layout.addColumnData(new ColumnWeightData(400)); 
    layout.addColumnData(new ColumnPixelData(70)); 

这里的类:

public class AutoResizeTableLayout extends TableLayout implements 
    ControlListener { 

private final Table table; 

private List<ColumnLayoutData> columns = 
    new ArrayList<ColumnLayoutData>(); 

private boolean autosizing = false; 

public AutoResizeTableLayout(Table table) { 
    this.table = table; 
    table.addControlListener(this); 
} 

public void addColumnData(ColumnLayoutData data) { 
    columns.add(data); 
    super.addColumnData(data); 
} 

public void controlMoved(ControlEvent e) { 
} 

public void controlResized(ControlEvent e) { 
    if (autosizing) 
     return; 
    autosizing = true; 
    try { 
     autoSizeColumns(); 
    } finally { 
     autosizing = false; 
    } 
} 

private void autoSizeColumns() { 
    int width = table.getClientArea().width; 

    // Layout is being called with an invalid value 
    // the first time it is being called on Linux. 
    // This method resets the layout to null, 
    // so we run it only when the value is OK. 
    if (width <= 1) 
     return; 

    TableColumn[] tableColumns = table.getColumns(); 
    int size = Math.min(columns.size(), tableColumns.length); 
    int[] widths = new int[size]; 
    int fixedWidth = 0; 
    int numberOfWeightColumns = 0; 
    int totalWeight = 0; 

    // First calc space occupied by fixed columns. 
    for (int i = 0; i < size; i++) { 
     ColumnLayoutData col = columns.get(i); 
     if (col instanceof ColumnPixelData) { 
      int pixels = ((ColumnPixelData) col).width; 
      widths[i] = pixels; 
      fixedWidth += pixels; 
     } else if (col instanceof ColumnWeightData) { 
      ColumnWeightData cw = (ColumnWeightData) col; 
      numberOfWeightColumns++; 
      int weight = cw.weight; 
      totalWeight += weight; 
     } else { 
      throw new IllegalStateException 
      ("Unknown column layout data"); 
     } 
    } 

    // Do we have columns that have a weight? 
    if (numberOfWeightColumns > 0) { 
     // Now, distribute the rest to the columns with weight. 
     // Make sure there's enough room, even if we have to scroll. 
     if (width < fixedWidth + totalWeight) 
      width = fixedWidth + totalWeight; 
     int rest = width - fixedWidth; 
     int totalDistributed = 0; 
     for (int i = 0; i < size; i++) { 
      ColumnLayoutData col = columns.get(i); 
      if (col instanceof ColumnWeightData) { 
       ColumnWeightData cw = (ColumnWeightData) col; 
       int weight = cw.weight; 
       int pixels = totalWeight == 0 ? 0 : weight * rest 
         /totalWeight; 
       if (pixels < cw.minimumWidth) 
        pixels = cw.minimumWidth; 
       totalDistributed += pixels; 
       widths[i] = pixels; 
      } 
     } 

     // Distribute any remaining pixels 
     // to columns with weight. 
     int diff = rest - totalDistributed; 
     for (int i = 0; diff > 0; i++) { 
      if (i == size) 
       i = 0; 
      ColumnLayoutData col = columns.get(i); 
      if (col instanceof ColumnWeightData) { 
       ++widths[i]; 
       --diff; 
      } 
     } 
    } 

    for (int i = 0; i < size; i++) { 
     if (tableColumns[i].getWidth() != widths[i]) 
      tableColumns[i].setWidth(widths[i]); 
    } 
} 
} 
+0

哇这只是调整大小相当复杂,是不是有一个简单的解决方案,像设置一个行的大小到一定的数量? – kadrian

+0

@ ka2011r:我想你可以使用TableLayout和addColumnData方法。 –

0

只是作为一个例子,如果你有一个使用布局的容器内的表,你可以使用布局数据设置大小:

final GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1); 
layoutData.minimumWidth = 300; 
0

我更喜欢TableColumnLayout或TreeColumnLayout。诀窍是将其设置为父级组合的布局,而不是表或树本身。

调整父容器大小时,列大小将自动更新。

TreeColumnLayout layout = new TreeColumnLayout(); 
    client.setLayout(layout); 

    viewer = new CheckboxTreeViewer(client, SWT.V_SCROLL | SWT.H_SCROLL); 
    viewer.getTree().setLinesVisible(true); 

    TreeViewerColumn firstColumn = new TreeViewerColumn(viewer, SWT.NONE); 
    layout.setColumnData(firstColumn.getColumn(), new ColumnWeightData(100, 10, true)); 

    TreeViewerColumn secondColumn = new TreeViewerColumn(resourcesViewer, SWT.NONE); 
    layout.setColumnData(secondColumn.getColumn(), new ColumnPixelData(20, false, true)); 
相关问题