您的位置:首页 > 编程语言 > Java开发

EclipseRCP开发之如何让表格中的各列随表格的变化始终充满整个表格

2011-08-06 11:26 351 查看
需求如题,具体实现如下:

先定义一个类:AutoResizeTableLayout.java

package com.winscad.util;

import java.util.ArrayList;

import java.util.List;

import org.eclipse.jface.viewers.ColumnLayoutData;

import org.eclipse.jface.viewers.ColumnPixelData;

import org.eclipse.jface.viewers.ColumnWeightData;

import org.eclipse.jface.viewers.TableLayout;

import org.eclipse.swt.events.ControlEvent;

import org.eclipse.swt.events.ControlListener;

import org.eclipse.swt.widgets.Table;

import org.eclipse.swt.widgets.TableColumn;

public class AutoResizeTableLayout extends TableLayout implements ControlListener ...{

private final Table table;

private List columns = new ArrayList();

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;

// XXX: 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 calculate space occupied by fixed columns.

for (int i = 0; i < size; i++) ...{

ColumnLayoutData col = (ColumnLayoutData) 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.

int rest = width - fixedWidth;

int totalDistributed = 0;

for (int i = 0; i < size; i++) ...{

ColumnLayoutData col = (ColumnLayoutData) 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 = (ColumnLayoutData) 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]);

}

}

}

然后在需要各列自动充满整个表格的表格中加上如下代码:

AutoResizeTableLayout layout = new AutoResizeTableLayout(tableRegionListInfo);

tableRegionListInfo.setLayout(layout);其中tableRegionListInfo为需要各列自动充满整个表格的表格(Table)

最后在表格中的各列中加上如下代码:

layout.addColumnData(new ColumnWeightData(200));

其中200代表此列在表格中所占的比例,例如在另外一列后面设置

layout.addColumnData(new ColumnWeightData(400));则此列在表格中所占的比例是上一个表格的两倍。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kevin99zhang/archive/2007/10/25/1843515.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: