SWT里的表格高级编程(1)(翻译)

//原文摘自《The Definitive Guide to SWT and JFace》
Table Viewers

SWT的表格widget,上一篇文章详细介绍了它的用法.你先生成一个Table,然后生成一个
TableItem来把数据放置到表格中.你将直接管理每行、每列,需要的时候你还要亲自为数
据排序,你将会发现非常麻烦.

JFace的TableViewer解决了所有的问题.象其它的viewers,你先生成一个TableViwer,
设置contentprovider,设置labelprovider,最后设置input.下表展示了TableViewer
的构造方法,两个没有以Table为参数的方法将自己生成一个Table.

Constructor                                    Description
TableViewer(Composite parent)                为parent生成一个TableViewer
TableViewer(Composite parent, int style)    以特定的风格为parent生成一个
                                            TableViewer
TableViewer(Table table)                    为特定的table生成TableViewer

*****Using a TableViewer
就象使用其它viewers一样,你生成一个content provider来为table增加内容,和一个
label provider来告诉table viewer应该如何展示内容.当然你得设置input data.
代码大概应该是这样子的:
TableViewer tableViewer = new TableViewer(parent);
tableViewer.setContentProvider(new MyContentProvider());
tableViewer.setLabelProvider(new MyLabelProvider());
tableViewer.setInput(myData);

*****content provider
和ListViewer一样,content provider必须实现IStructureContentProvider接口,
IStructureContentProvider接口定义了如下3个方法:

Method                                Descriptin
void dispose()                        当TableViewer被dispose的时候调用此方
                                    法.在这个方法中你应该dispose所有你已经
                                    生成并需要dispose的对象.

Object[] getElements(Object            当TableViewer需要为表格列出每行的时候
inputElement)                        调用此方法.为表格返回一行数据.


void inputChanged(Viewer viewer, Object        当前的内部数据结构改变的时候
oldInput, Object newInput)            调用此方法,这个方法将提供对数据变化的
                                    具体措施.
                                   
比如,假设一个叫myList的ArrayList包含了你的数据.myList里的每个对象属于自己定义
的一个叫做Widget的类,它包含了一个name,一个color和一个price.每个Widget还包含
一个自己的图形.你的content provider也许看起来象这样:
public class MyContentProvider implements IStructuredContentProvider {
    public void dispose() {
    //没有什么需要dispose
    }
    public Object[] getElements(Object inputElement) {
        //inputElement, the input data, is myList
        return ((LIst)myList).toArray();
    }
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
        //Nothing to do
    }
}
getElemets()方法以数组的形式返回所有的Widgets.数组里的所有对象将在表格变成一行.
但是,如果没有label provider,将没有任何东西显示在表格中,要是表格可视,你必须生成
一个label provider.

*****label provider
lable provider必须实现ITableLabelProvider接口,需要实现以下6个方法:
Method
void addListener                    当为这个label provider增加一个监听器
(ILableProvider Listener            的时候调用此方法,把listener加到你自己的
listener)                            一个list里.

void dispose()                        当TableViewer被dispose的时候调用此方
                                    法.在这个方法中你应该dispose所有你已经
                                    生成并需要dispose的对象.

Image getColumnImage                为特定的列中的你想为其中某个单元格增加
(Object element, int                 图片.如果不想设置图片就返回null
columnIndex)

boolean isLabelProperty                当TableViewer希望确定特定单元格特定的
(Object element, String             属性改变的时候对label是否有影响时调用
property)                            此方法.如果改变将影响特定单元格的lable
                                    就返回true,否则返回false.

void removeListener                    当从label provider中移去一个监听器时
(ILabelProviderListener                调用此方法.在这个方法中,你将从你自己的
listener)                            list中移去这个listener.

以上面的Widget为例,你的label provider大概应该是这个样子:
public class MyLabelProvider implements ITableLabelProvider {
    //Holds the listeners
    List listeners = new ArrayList();
    public void addListener(ILabelProviderListener listener) {
        //Add the listener
        listeners.add(listener);
    }
   
    public void dispose() {
        //没有任何对象需要dispose--这些widgets拥有属于自己的图片
    }
   
    public Image getColumnImage(Object element, int columnIndex) {
        //Show the image by the name
        if (columnIndex == NAME_COLUMN)
            return ((Widget)element).getImage();
        return null;
    }
   
    public String getColumnText(Object element, int columnIndex) {
        Widget w = (Widget) element;
        switch (columnIndex) {
        case NAME_COLUMN:
            return w.getName();
        case COLOR_COLUMN:
            return w.getColor();
        case PRICE_COLUMN:
            return w.getPrice();
        }
        // Should never get here
        return "";
    }
   
    public boolean isLabelProperty(Object element, String property) {
        return false;
    }
   
    public void removeListener(ILabelProviderListener listener) {
        listeners.remove(listener);
    }
}

你必须在某个地方定义column常量(NAME_COLUMN,COLOR_COLUMN和PRICE_COLUMN).它们
对应于表格中的columns.记住你必须为表格生成表格列,代码看起来象这样:
// Get the underlying table
Table table = tableViewer.getTable();
new TableColumn(table,SWT.LEFT).setText("Name");
new TableColumn(table,SWT.LEFT).setText("Color");
new TableColumn(table,SWT.LEFT).setText("Price");
   
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值