如何在GridLayout中调整TableViewer的大小

kad*_*ian 0 java eclipse plugins swt jface

我有一个TableViewer内部GridLayout.一切都很好,表格查看器显示为一个白色区域,其中包含一些数据.问题是白色区域非常高但几乎没有宽度.我没有发现任何设置此查看器大小的可能性.

我需要以某种方式调整布局吗?我怎么也找不到!在TableViewer似乎没有任何填补其细胞...

有任何想法吗?

Gil*_*anc 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));
Run Code Online (Sandbox Code Playgroud)

这是班级:

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]);
    }
}
}
Run Code Online (Sandbox Code Playgroud)