`

table的列宽自动矫正。resize.

阅读更多
1.在第一个类来写
   protected void createTableColumns(Table table) {
        List columnNames = new ArrayList();

        TableLayout tableLayout = new AutoResizeTableLayout(table);

        for(Iterator iter = getLabelAccessors().iterator(); iter.hasNext();)
        {
            Accessor accessor = (Accessor)(iter.next());
            String label = accessor.getOptionalString();
            columnNames.add(label);

            if(accessor instanceof AbstractLabelAccessor)
            {
                AbstractLabelAccessor labelAccessor = (AbstractLabelAccessor)accessor;
                if(labelAccessor.isFixed())
                {
                    if(labelAccessor.getWidth() >= 0)
                    {
                        tableLayout.addColumnData(new ColumnPixelData(labelAccessor.getWidth()));
                    }
                    else
                    {
                        tableLayout.addColumnData(new ColumnWeightData(100/getLabelAccessors().size()));
                    }
                }
                else
                {
                    if(labelAccessor.getWeight() >= 0)
                    {
                        if(labelAccessor.getMinWidth() >= 0)
                        {
                            tableLayout.addColumnData(new ColumnWeightData(labelAccessor.getWeight(), labelAccessor.getMinWidth()));
                        }
                        else
                        {
                            tableLayout.addColumnData(new ColumnWeightData(labelAccessor.getWeight()));
                        }
                    }
                    else
                    {
                        // ignore MinWidth...
                        tableLayout.addColumnData(new ColumnWeightData(100/getLabelAccessors().size()));
                    }
                }
            }
            else
            {
                if(label.length() == 0)
                {
                    tableLayout.addColumnData(new ColumnWeightData(NO_ABSTRACT_LABEL_ACCESSOR_EMPTY_LABEL_COLUMN_WEIGHT, true));
                }
                else
                {
                    tableLayout.addColumnData(new ColumnWeightData(NO_ABSTRACT_LABEL_ACCESSOR_NO_EMPTY_LABEL_COLUMN_WEIGHT, NO_ABSTRACT_LABEL_ACCESSOR_NO_EMPTY_LABEL_COLUMN_MINWIDTH, true));
                }
            }
        }


        for (Iterator iter = columnNames.iterator(); iter.hasNext();)
        {
            TableColumn column = new TableColumn(table, SWT.NONE);
//            column.setMoveable(true);
            column.setText((String)iter.next());
        }

        table.setLayout(tableLayout);
        table.pack();

    }



2.然后写一个TableLayout 的子类
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;

/**
 * COMMENT - Add description of this class or interface here.
 *           Description should go beyond the class/interface name.
 *           Use the following template:
 *
 * <Short description of class (noun phrase) followed by a dot>
 * <More elaborate description of what kind of object this class or interface represents.>
 * <Give information on (special) characteristics if possible.>
 */
public class AutoResizeTableLayout extends TableLayout implements ControlListener{

    private final Table table;
    private List columns = new ArrayList();
    private boolean autosizing = false;
    private int oldWidth;

    /**
     * COMMENT - Add concise description of this constructor.
     *           Description should go beyond the constructor's name.
     *
     *
     */
    public AutoResizeTableLayout(final Table table) {
        this.table = table;
        table.addControlListener(this);
    }

    public void addColumnData(ColumnLayoutData data){
        columns.add(data);
        super.addColumnData(data);
    }

    /* (non-Javadoc)
     * @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
     */
    public void controlMoved(ControlEvent e) {
    }

    /* (non-Javadoc)
     * @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
     */
    public void controlResized(ControlEvent e) {
        // only react on changing width min. few pixels
        // (see workaround for SWT bug getting unnecessary scroll bar)
        if (Math.abs(oldWidth - table.getClientArea().width) > 5) {
            if (autosizing) {
                return;
            }
            autosizing = true;
            try {
                autoSizeColumns();
            } finally {
                autosizing = false;
                oldWidth = table.getClientArea().width;
            }
        }
    }

    /**
     * <Short description (short verb phrase possible) followed by a dot>
     * <More elaborate description of "what" this method does. Omit the "how" unless necessary.>
     *
     *
     */
    private void autoSizeColumns() {
        int width = table.getClientArea().width;
        width -= 10; // workaround for SWT bug getting unnecessary scroll bar

        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 = (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"); //$NON-NLS-1$
            }
        }

        //Do we have columns that have 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]);
        }
    }

    /**
     * remove this from the tables listeners.
     */
    public void dispose() {
        table.removeControlListener(this);
    }
}
分享到:
评论

相关推荐

    jquery.ba-resize.min

    《jQuery的resize()事件与jquery.ba-resize.min.js插件详解》 在Web开发中,JavaScript库jQuery大大简化了DOM操作,包括事件处理。其中,`resize()`事件用于监听窗口或元素尺寸的变化,但直接使用`$(window).resize...

    uniapp editor富文本 quill.min.js image-resize.min.js

    在uniapp项目中结合使用Quill和image-resize.min.js,开发者可以实现用户上传图片后自动调整到合适的大小,确保用户体验的同时,也优化了应用的性能。 在uniapp中集成Quill编辑器的步骤大致如下: 1. 安装依赖:...

    LabVIEW表格列宽自动调节.rar

    - 在某些版本的LabVIEW中,选择“Resize Columns to Fit Data”选项可以实现列宽的自动调整。 4. **VI服务(VISA)**: - 对于涉及到硬件通信的项目,可能需要使用VI服务来读取数据,这时可以结合VISA事件,当...

    jquery.ba-resize.min.js

    用于DOM元素变化,当元素变化时,用户需要做出什么操作

    jquery.ba-resize.js

    《深入理解jQuery.ba-resize.js:扩展JavaScript的窗口与元素尺寸改变事件》 在Web开发中,JavaScript(JS)作为客户端脚本语言,扮演着至关重要的角色。然而,原生的JavaScript并不直接支持监听DOM元素的尺寸变化...

    bootstrapTable实现列宽可拖动

    $('#table').on('column-resize', function (e, field, newWidth) { // 保存或处理新的列宽 }); ``` 6. **优化用户体验**:为了提高用户体验,可以添加一些视觉反馈,例如在鼠标悬浮在列边界时显示调整线,或者在...

    qull.min.js,image-resize.min.js,uniappH5端editor富文本报错问题

    qull.min.js,image-resize.min.js qull.min.js image-resize.min.js uniapp——内网部署H5端editor富文本报错问题 亲测有效 免费下载

    前端项目-javascript-detect-element-resize.zip

    1. 引入库:首先,你需要将`javascript-detect-element-resize.js`文件引入到你的HTML文档中,或者通过模块系统(如CommonJS或ES6模块)来导入。 2. 创建实例:然后,你可以创建一个新的检测器实例,传入要监听的...

    VB.rar_ReSize.ocx_imgctls.ocx_vb 编程_vb编程资源

    例如,你可以设计一个表格控件,当窗口大小改变时,表格会自动调整列宽以适应新的空间。 2. **ImgCtrls.ocx**: 这个控件集包含了一系列图像处理相关的控件,如图片框、图像滑块等,用于增强应用程序的图形显示...

    VB resizeWindow.txt resizeWindow.txt

    resizeWindow.txt resizeWindow.txt resizeWindow.txtresizeWindow.txtresizeWindow.txt resizeWindow.txt resizeWindow.txt resizeWindow.txt

    GIF Resize.rar

    标题中的"GIF Resize.rar"表明这是一个关于调整GIF图像大小的压缩文件,通常包含软件、教程或其他资源。GIF是一种常见的动画图像格式,用于在网络上显示动态图像。在互联网上,优化图片大小对于加载速度和用户体验至...

    易语言模块ReSize.rar

    2. 控件大小调整:对于界面中的控件,如按钮、文本框等,ReSize模块能帮助开发者实现控件随窗口大小变化而自动调整大小,保持界面的美观和可用性。 3. 布局算法:模块内含了多种布局策略,如网格布局、流式布局等,...

    xm-resize.rar_ENVI Resize_ENVI裁剪_growp7w_rio resize envi

    【标题解析】:“xm-resize.rar”是一个RAR压缩文件,其中包含了与ENVI(Environment for Visualizing Images,图像可视化环境)软件相关的“Resize”操作,可能是用于调整或裁剪遥感图像的工具或数据。"ENVI Resize...

    lineage-18.1-rpi-resize.zip

    2. `rpi-resize.sh`:这是一个脚本文件,很可能是为了自动执行分区扩展的程序。在安装LineageOS后,可能需要运行这个脚本来确保系统分区适应整个可用存储空间,尤其是当树莓派的SD卡或USB存储设备容量较大时。 3. `...

    FORM-RESIZE.rar_resize

    在VB6(Visual Basic 6)中,"FORM-RESIZE.rar_resize"的主题涉及到了窗体(Form)的大小调整,这是一个重要的用户界面(UI)设计元素。在VB6环境中,开发者经常需要处理窗体控件的大小改变,以便适应不同屏幕分辨率...

    Go-resize-纯golang实现的图像大小调整库

    在这个例子中,我们首先使用第三方库`imaging`打开图像,然后使用`resize.Resize`方法将其缩放到800像素宽度,高度自动调整,使用的是Lanczos3高质量缩放算法,最后保存结果。 4. **性能考虑** Go-resize库设计时...

    可调整列宽TABLE

    在网页设计中,"可调整列宽TABLE"是一种常见的交互式数据展示技术,它使得用户可以根据需要自由调整表格中列的宽度。这种功能通常应用于数据量大、信息丰富的表格,以便用户能更清晰地查看和理解数据。下面将详细...

    GIF Resize.zip

    "GIF Resize.zip"这个文件名暗示了它可能是一个包含工具或教程的压缩包,专门用于调整GIF图像的大小。GIF是一种广泛使用的图像格式,尤其适合创建简单的动画和透明效果。下面我们将深入探讨GIF图像的大小调整以及与...

Global site tag (gtag.js) - Google Analytics