2013-08-20 7 views
2

Я хочу таблицу, которая имеет комбо в качестве одного из своих столбцов. Я уже выяснил, что с таблицей с этим вопросом невозможно: Controls (Combo, Radio, Text) in column header SWTCombo в headheader с swt

Есть ли способ вокруг этого? Я попробовал TableViewer, но не нашел способ сделать это с ним. Есть ли способ, которым это может быть достигнуто?

ответ

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(); 
    } 
} 
Смежные вопросы