2

我想要一个将组合作为其列标题之一的表。我已经从这个问题中发现使用 Table 是不可能的: Controls (Combo, Radio, Text) in column header SWT

有办法解决吗?我尝试了 TableViewer,但也没有找到解决方法。有什么办法可以实现吗?

4

1 回答 1

3

Composite您可以使用普通控件在表格上方创建自己的列标题。

然后,您需要调整这些控件的大小以匹配表格列的大小。一种方法是使用扩展 jface 的表格布局类TableColumnLayout并覆盖setColumnWidths每次列大小更改时调用的方法,以便您可以调整标题控件宽度。

注意:TableColumnLayout 需要位于Composite仅包含 的Table而不是直接位于Table.

所以布局是这样的:

/**
 * Table column layout extended to manage a separate table header.
 */
public class TableColumnLayoutWithSeparateHeader extends TableColumnLayout
{
  /** Header composite */
  private final Composite _headerComposite;
  /** Right margin adjust */
  private final int _rightMargin;


  /**
   * Constructor.
   *
   * @param headerComposite Header composite
   * @param rightMargin Right margin value
   */
  public TableColumnLayoutWithSeparateHeader(final Composite headerComposite, final int rightMargin)
  {
    super();

    _headerComposite = headerComposite;
    _rightMargin = rightMargin;
  }


  /**
   * {@inheritDoc}
   * @see org.eclipse.jface.layout.TableColumnLayout#setColumnWidths(org.eclipse.swt.widgets.Scrollable, int[])
   */
  @Override
  protected void setColumnWidths(final Scrollable tableTree, final int [] widths)
  {
    super.setColumnWidths(tableTree, widths);

    // Update the header composite

    final Control [] children = _headerComposite.getChildren();

    final int size = Math.min(widths.length, children.length);

    for (int index = 0; index < size; ++index) {
       final GridData data = (GridData)children[index].getLayoutData();

       int width = widths[index];
       if (index == (size - 1))
         width -= _rightMargin;

       data.widthHint = width; 
     }

    _headerComposite.layout();
  }
}
于 2013-08-22T09:17:19.323 回答