SWT中TableViewer的使用:
在Java中,我们应用比PHP,ASP更加规范的方式来操作数据,将数据库中的记录当作一个数据对象,用一个类来表示,数据表的字段写成类的实例变量,即Java中被称为实体类.EJB和Hibernate都是用这种方式.(数据库--实体类--表格显示)
使用的步骤:
1. 依照表中的字段类创造一个相应的实体类:(下面是一个实体类的例子)
public class SomethingEntity{
private String name;
private boolean sex;
private int age;
public String getName(){ return name;}
public void setName(String s){ name = s;}
public boolean isSex() { return sex;}
public void setSex(boolean b){ sex = b;}
public int getAge(){ return age;}
public void setAge(int i){ age = i;}
}
2. 数据的生成,创建对象工厂:(下面是一个对象工厂的例子)
public class SomethingFactory{
public static List getSomethings(){
List list = new ArrayList();
SomethingEntity sometihing = new SomethingEntity();
something.setName("某某");
something.setSex(true);
something.setAge(18);
list.add(something);
return list;
}
}
在实际中,getSomethings()方法的代码可以用从数据库中取数据的代码来代替.
List不是SWT的List.而是java.util.List list不是必须的,可以用Set,Map等.
List只是一个接口,而ArrayList才是实际应用的类.也可以用Vector,LinkedList等.
3. 数据在TableViewer中的显示:
I. 定义一个TableViewer对象. 在定义时,可通过TableViewer构造函数提供的参数设置样式.
II. 将TableViewer置于容器类中,并布局.
III. 创建TableVewer中的列(TableColumn).
IV. 用setInput方法输入数据.
V. 设定内容器.
VI. 设定标签器.
这里出现了2个新的概念:内容器,标签器.它们时JFace组件中经常用到的.实际上时IStructuredContextProvider和ITableLabelProvider这2个接口的实现类.作用时定义数据进入后在TableViewer中的显示.
下面是一个实现的例子:
第一个文件(MainForm.java):
public class MainForm{
public static void main(String[] args){
MainForm window = new MainForm();
window.open();
}
private TableViewer tableViewer;
public void open(){
final Display display = new Display();
final Shell shell = new Shell();
shell.setSize(500,150);
shell.setLayout(new FillLayout());
shell.setText("TableViewer实现");
//调用自定义的createTableViewer方法
createTableViewer(shell);
tableViewer.setContentProvider(new TableViewerContentProvider());
tableViewer.setLabelProvider(new TableViewerLabelProvider());
tableViewer.setInput(SomethingFactory.getSomethings());
shell.open();
while(!shell.isDisposed()){
if(!display.readAndDispatch()) display.sleep();
}
}
//自定义方法创建TableViewer
private void createTableViewer(Composite parent){
tableViewer = new TableViewer(parent, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION);
Table table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
TableLayout tableLayout = new TableLayout();
table.setLayout(tableLayout);
tableLayout.addColumnData(new ColumnWeightData(40));
new TableColumn(table, SWT.NONE).setText("姓名");
tableLayout.addColumnData(new ColumnWeightData(20));
new TableColumn(table, SWT.NONE).setText("性别");
tableLayout.addColumnData(new ColumnWeightData(20));
new TableColumn(table, SWT.NONE).setText("年龄");
}
}
第二个文件(TableViewerContentProvider.java)(内容器):
public class TableViewerContentProvider implements IStructuredContentProvider{
public Object[] getElements(Object element){
if(element instanceof List)
return ((List)element).toArray();
else
new Object[0];
}
public void dispose() {}
public void inputChanged(Viewer v, Object oldInput, Object newInput){}
}
第三个文件(
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.graphics.Image;
public class TableViewerLabelProvider implements ITableLabelProvider {
public String getColumnText(Object element, int col){
SomethingEntity o = (SomethingEntity)element;
if(col==0) return o.getName();
if(col==1) return o.isSex() ? "男":"女";
if(col==2) return "" + o.getAge();
return "";
}
public Image getColumnImage(Object element, int columnIndex){
return null;
}
public void addListener(ILableProviderListener listener){}
public void dispose() {}
public boolean isLableProperty(Object element, String property){
return false;
}
public void removeListener(ILabelProviderListener listener){}
}
}