Как настроить размер TableViewer внутри GridLayout - PullRequest
0 голосов
/ 06 сентября 2011

У меня есть TableViewer внутри GridLayout.Все работает хорошо, и средство просмотра таблиц отображается в виде белой области с некоторыми данными в нем.Проблема в том, что белая область очень высокая, но почти не имеет ширины.Я не нашел возможности установить размер этого средства просмотра.

Нужно ли как-то настраивать макет?Я не мог узнать как!TableViewer, похоже, тоже не заполняет свою клетку ...

есть идеи?

Ответы [ 3 ]

5 голосов
/ 06 сентября 2011

Я использовал класс для автоматической настройки ширины 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 голосов
/ 19 февраля 2016

Я предпочитаю 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));
0 голосов
/ 28 октября 2015

Например, если у вас есть таблица внутри контейнера, который использует макет, вы можете использовать данные макета для установки размера:

final GridData layoutData = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1);
layoutData.minimumWidth = 300;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...