【问题标题】:How to adjust the size of a TableViewer inside a GridLayout如何在 GridLayout 中调整 TableViewer 的大小
【发布时间】:2011-11-11 07:24:10
【问题描述】:

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

我需要以某种方式调整布局吗?我不知道怎么做! TableViewer 似乎也没有填满它的单元格......

有什么想法吗?

【问题讨论】:

    标签: java eclipse plugins swt jface


    【解决方案1】:

    我最终使用了一个类来根据数据自动调整 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]);
        }
    }
    }
    

    【讨论】:

    • 哇,这只是调整大小相当复杂,难道没有像将行大小设置为某个数量这样的简单解决方案吗?
    • @ka2011r:我想你可以只使用 TableLayout 和 addColumnData 方法。
    【解决方案2】:

    我更喜欢 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));
    

    【讨论】:

      【解决方案3】:

      举个例子,如果你有一个容器内的表格使用布局,你可以使用布局数据来设置大小:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多