JFace Viewer允许你的不改变原始数据的前提下,将这些数据以List、Table、Tree等形式显示出来。
现在,我们假设要显示在Table中的数据为Book对象,Book类的定义如下:
JFace Viewer的设计使用了适配器模式,而适配模式的核心思想是:
1。 不改造原有接口
2。 添加一个新的适配类来适配原有的接口
3。 让这个新的适配类提供满足客户需求的接口
类图如下:
举一个现实生活中的例子,你的笔记本电源适配器(Adapter)适配了提供220V电压的供电插座(Adaptee),从而为你的笔记本(Target)电源接口供电。和现实生活中Target只和Adapter打交道(笔记本只和电源适配器连接),它并不需要知道Adaptee的存在。
在JFace Viewer中,被适配对象就是原始数据,而Target就是List、Table、Tree等视图组件。TableViewer中中设计到的主要类以及它们之间的关系如下:
接下来,我将以一个完成的程序演示TableViewer的使用:
TableViewer最终以Table的形式显示数据,而Table中的每一行是一个对象,每一列是这个对象的不同属性。如下表所示:
attr1 | attr2 | attr3 |
obj1.attr1 | obj1.attr2 | obj1.attr3 |
obj2.attr1 | obj2.attr2 | obj2.attr3 |
package org.vhow.jface.tableviewer;
public class Book
{
private String name;
private String author;
private float price;
public Book(String name, String author, float price)
{
super();
this.name = name;
this.author = author;
this.price = price;
}
public String getName()
{
return name;
}
public String getAuthor()
{
return author;
}
public float getPrice()
{
return price;
}
}
因为我们还需要向ContentProvider提供原始的数据(Book对象集),所以我们创建一个简单的Book工厂:
package org.vhow.jface.tableviewer;
import java.util.ArrayList;
import java.util.List;
public class BookFactory
{
public List<Book> getBooks()
{
List<Book> list = new ArrayList<Book>();
list.add(new Book("Book A", "Author A", 10.0f));
list.add(new Book("Book B", "Author B", 20.0f));
list.add(new Book("Book C", "Author C", 30.0f));
return list;
}
}
TableViewer以来ContentProvider提供数据,现在我们来定义ContentProvider:
package org.vhow.jface.tableviewer;
import java.util.List;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.Viewer;
public class BookContentProvider implements IStructuredContentProvider
{
@Override
public void dispose()
{
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
}
/**
* Returns the elements to display in the viewer when its input is set to
* the given element. These elements can be presented as rows in a table,
* items in a list, etc. The result is not modified by the viewer.
*/
@Override
public Object[] getElements(Object inputElement)
{
List<Book> list = (List<Book>) inputElement;
return list.toArray();
}
}
ContentProvider以对象列表的形式向Table提供每一行数据,现在我们就要定义Table中的每一列要显示成什么样子
package org.vhow.jface.tableviewer;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.graphics.Image;
public class BookLabelProvider implements ITableLabelProvider
{
@Override
public void addListener(ILabelProviderListener listener)
{
}
@Override
public void dispose()
{
}
@Override
public boolean isLabelProperty(Object element, String property)
{
return false;
}
@Override
public void removeListener(ILabelProviderListener listener)
{
}
@Override
public Image getColumnImage(Object element, int columnIndex)
{
return null;
}
/**
* Returns the label text for the given column of the given element.
*/
@Override
public String getColumnText(Object element, int columnIndex)
{
String columnText = "";
Book book = (Book) element;
switch (columnIndex)
{
case 0:
columnText = book.getName();
break;
case 1:
columnText = book.getAuthor();
break;
case 2:
columnText = String.valueOf(book.getPrice());
break;
default:
break;
}
return columnText;
}
}
准备工作已经完毕,接下来是实现TableViewer:
package org.vhow.jface.tableviewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
public class BookTableViewer
{
public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new FillLayout());
// core snippet start...
// 1. Construct a TableViewer object
TableViewer tableViewer = new TableViewer(shell, SWT.MULTI | SWT.H_SCROLL
| SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.BORDER);
// 2. Get the Table object that the TableViewer contains
Table table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
// 3. Create new columns for this Table object
new TableColumn(table, SWT.BORDER).setText("Name");
new TableColumn(table, SWT.BORDER).setText("Author");
new TableColumn(table, SWT.BORDER).setText("Price");
for (int i = 0; i < table.getColumnCount(); i++)
{
table.getColumn(i).pack();
}
// 4. Set content provider
tableViewer.setContentProvider(new BookContentProvider());
// 5. Set label provider
tableViewer.setLabelProvider(new BookLabelProvider());
// 6. set input data
tableViewer.setInput(BookFactory.getBooks());
// core snippet end.
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
shell.dispose();
}
}
这样就实现了一个最简单的TableViewer:
ps: A good article about how to create a editable TableViewer:
http://www.eclipse.org/articles/Article-Table-viewer/table_viewer.html