JFace - 分析TableViewer的设计

JFace Viewer允许你的不改变原始数据的前提下,将这些数据以List、Table、Tree等形式显示出来。


JFace Viewer的设计使用了适配器模式,而适配模式的核心思想是:

1。 不改造原有接口

2。 添加一个新的适配类来适配原有的接口

3。 让这个新的适配类提供满足客户需求的接口

类图如下:

举一个现实生活中的例子,你的笔记本电源适配器(Adapter)适配了提供220V电压的供电插座(Adaptee),从而为你的笔记本(Target)电源接口供电。和现实生活中Target只和Adapter打交道(笔记本只和电源适配器连接),它并不需要知道Adaptee的存在。

在JFace Viewer中,被适配对象就是原始数据,而Target就是List、Table、Tree等视图组件。TableViewer中中设计到的主要类以及它们之间的关系如下:


接下来,我将以一个完成的程序演示TableViewer的使用:

TableViewer最终以Table的形式显示数据,而Table中的每一行是一个对象,每一列是这个对象的不同属性。如下表所示:

attr1attr2attr3
obj1.attr1obj1.attr2obj1.attr3
obj2.attr1obj2.attr2obj2.attr3
现在,我们假设要显示在Table中的数据为Book对象,Book类的定义如下:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值