//原文摘自《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");
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");