`
longgangbai
  • 浏览: 7343437 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

RCP中一个Tableviewer特有的的Layout (TableLayout)的扩展

阅读更多

   为了使TableViewer中各列间距相等编写的类,继承自Tablelayout,实现ControlListener 接口。

 

 

 

package com.unutrip.plugin.dev.commons;

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;

/**
 * AutoResizeTableLayout layout = new AutoResizeTableLayout(tableRegionListInfo);   
 *      
 *      tableRegionListInfo.setLayout(layout);   
 *  其中tableRegionListInfo为需要各列自动充满整个表格的表格(Table)  
 * 
 * 最后在表格中的各列中加上如下代码: 
 *layout.addColumnData(new ColumnWeightData(200)); 
 * 其中200代表此列在表格中所占的比例,例如在另外一列后面设置 
 * layout.addColumnData(new ColumnWeightData(400));则此列在表格中所占的比例是上一个表格的两倍。 
 * @author longgangbai
 *
 */
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);
	}

	@Override
	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 = false;
		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]);   
        }   
    
	}
}


 

分享到:
评论

相关推荐

    RCP开发之TableViewer 列的显示与隐藏

    RCP开发比Table更高级的TableViewer的使用。实现列的隐藏与显示

    RCP 常见的扩展点指南

    "RCP 常见的扩展点指南" RCP(Rich Client Platform)是 Eclipse 基金会推出的一个基于 Java 的开源平台,旨在提供一个通用的客户端应用程序开发平台。RCP 的扩展点是其核心组成部分之一,本节将详细介绍 RCP 的...

    Set TableViewer Cell Focus

    在IT领域,特别是Java Swing和Eclipse RCP开发中,TableViewer是经常被用来展示数据的一个组件。"Set TableViewer Cell Focus"这个话题是关于如何在TableViewer中设置焦点到特定单元格上,这对于实现用户交互和数据...

    RCP扩展点自定义

    ### RCP扩展点自定义详解 #### 一、引言 Eclipse 是一款非常流行的集成开发环境(IDE),因其强大的可扩展性和灵活性而备受开发者喜爱。Eclipse 的核心设计原则之一便是通过“扩展点”机制支持插件开发,从而允许...

    RCP自定义透视图切换按钮的右键菜单

    透视图是Eclipse RCP中的一个重要概念,它定义了工作台窗口中各视图和编辑器的布局。默认情况下,Eclipse RCP提供了标准的透视图切换方式,但开发者可以根据需求进行自定义。下面我们将逐步解析这个过程: 1. **...

    论文研究-Eclipse RCP的扩展点与扩展机制研究 .pdf

    Eclipse RCP的扩展点与扩展机制研究,金星善,库少平,RCP (Rich Client Platform) 是基于Eclipse开发平台而推出的一套用来开发富客户端程序的应用框架。Eclipse的插件机制,使得我们可以通过扩展Ecli

    rcp自己通过扩展点新建java项目

    `rcp自己通过扩展点新建java项目`这个主题涉及了如何利用Eclipse的插件体系和扩展点机制来实现这一功能。Eclipse的插件系统基于OSGi框架,它允许开发者将功能模块化,而扩展点则是连接这些模块的桥梁,使得不同插件...

    SWT中自己订制了一个TableViewer(用于我的列出项目中的所有错误信息),作为测试用的。与大家分享

    在IT行业中,特别是Java Swing和Eclipse RCP开发领域,SWT(Standard Widget Toolkit)是一个广泛应用的图形用户界面(GUI)库。它提供了丰富的控件和API,使得开发者能够创建功能强大的桌面应用程序。本篇文章将...

    eclipse RCP开发一个简单的MYSQL客户端工具介绍

    Eclipse RCP(Rich Client Platform)是一个用于构建桌面应用程序的强大框架,它允许开发者利用Java语言创建功能丰富的、可扩展的应用程序。本篇文章将详细介绍如何利用Eclipse RCP开发一个简单的MySQL客户端工具,...

    eclipse RCP学习项目源码&amp;扩展控制台插件for eclipse3.5

    Eclipse Rich Client Platform (RCP) 是一个强大的框架,用于构建桌面应用程序,它基于Java语言,充分利用了Eclipse的灵活性和可扩展性。这个压缩包包含的“eclipse RCP学习项目源码&扩展控制台插件for eclipse3.5”...

    tableviewer edit

    在 Eclipse RCP(Rich Client Platform)开发中,`TableViewer` 是一个强大的组件,用于展示数据表。`TableViewer` 是 `JFace` 库的一部分,它提供了与 SWT(Standard Widget Toolkit)表格控件的高级接口,使得数据...

    Rcp一个简单的入门教程

    **RCP(Rich Client Platform)** 是Eclipse项目的一个核心组成部分,它提供了一个框架,用于构建功能丰富的桌面应用程序。RCP允许开发者利用Eclipse的强大功能,如插件系统、工作台管理、视图和编辑器,来快速开发...

    RCP,RCP开发

    RCP提供了一个灵活的基础平台,允许开发者利用插件系统来扩展应用程序的功能,而无需从头开始编写整个用户界面。通过RCP,开发者可以专注于业务逻辑,而UI组件和框架已经由RCP提供,大大提高了开发效率。 **RCP核心...

    rcp工程的描述

    例如,一个插件可以定义一个“视图”扩展点,其他插件就可以通过扩展这个点来添加新的视图到RCP应用程序中。 5. **工作台(Workbench)** RCP的工作台是整个应用程序的中心,负责管理窗口、视图、编辑器和其他UI...

    RCP 界面布局实例

    RCP基于插件模型,每个功能模块都可以作为一个独立的插件,这使得RCP具有高度的可扩展性和灵活性。在RCP应用中,界面布局通常由多个组件构成,如视图(View)、编辑器(Editor)、透视图(Perspective)等。 视图是...

    RCP程序设计自学RCP的教程

    RCP,即Rich Client Platform(富客户端平台),是Eclipse提供的一个强大的框架,用于构建可扩展的桌面应用程序。它允许开发者利用Eclipse的核心架构和设计模式,创建高度定制化且功能丰富的应用。Eclipse RCP的设计...

    RCP 程序类

    这个文件名表明内容可能专注于`ApplicationWorkbenchWindowAdvisor`类,这是Eclipse RCP中一个关键的组件。此类通常用于自定义工作台窗口的行为,比如初始化、布局调整、菜单和工具栏的设置等。开发者可能在博文中...

    RCP中文入门教程.rar

    在“RCP中文入门教程.pdf”中,你可能会学习到如何创建一个新的RCP项目,编写插件,定义扩展点,创建视图和编辑器,以及如何管理和配置用户的首选项。教程还可能涵盖如何调试和打包RCP应用,以及如何利用Eclipse的...

    Tableviewer实现

    在Java开发领域,尤其是涉及到Swing或Eclipse RCP( Rich Client Platform)应用程序时,`TableViewer`是一个非常重要的组件。它允许开发者在用户界面中展示表格数据,并提供了丰富的功能来处理这些数据。本篇文章将...

    Eclipse RCP详细教程

    1. **定义扩展点**:在插件的`plugin.xml`文件中定义一个扩展点,例如`org.eclipse.ui.menus`。 2. **添加菜单和工具栏**:在扩展点中定义菜单和工具栏的结构以及绑定的动作。 ```xml ``` 以上介绍了...

Global site tag (gtag.js) - Google Analytics