swt tableviewer 定位到某一行

 我来答
若以下回答无法解决问题,邀请你更新回答
o夏怡然o
2014-05-27 · 知道合伙人IT服务行家
o夏怡然o
知道合伙人IT服务行家
采纳数:13261 获赞数:88410
毕业于电子科技大学,硕士学位。软件开发行业4年从业经验,做过多个大型项目,现任研发部高级软件工程师。

向TA提问 私信TA
展开全部
TableViewer使用说明
类TableViewer在viewer包下,要在TableViewer这个类的表中显示数据时,要使用内容器和标签器这两个类。内容器(IStructuredContentProvider):它的作用是从集合类中提取对象(在数据库中这个对象是一条记录);标签器(ITableLableProvider):从内容器中提取到的对象中提取出一个字段(在数据库中对应于某一列的一个值)。
1 下面是关于TableViewer的使用:
第一步:创建一个TableViewer对象。

TableViewer tv = new TableViewer(shell, SWT.MULTI | SWT.BORDER | SWT.FULL_SELECTION | SWT.V_SCROLL | SWT.H_SCROLL);
第二步:通过表格内含的Table对象设置布局方式
Table table = tv.getTable();
table.setHeaderVisible(true); // 显示表头
table.setLinesVisible(true); // 显示表格线
TableLayout layout = new TableLayout(); // 专用于表格的布局
table.setLayout(layout);
第三步:用TableColumn类创建表格列
layout.addColumnData(new ColumnWeightData(13));// ID列宽13像素
new TableColumn(table, SWT.NONE).setText("ID号");
layout.addColumnData(new ColumnWeightData(40));
new TableColumn(table, SWT.NONE).setText("姓名");
layout.addColumnData(new ColumnWeightData(20));
new TableColumn(table, SWT.NONE).setText("性别");
layout.addColumnData(new ColumnWeightData(20));
new TableColumn(table, SWT.NONE).setText("年龄");
layout.addColumnData(new ColumnWeightData(60));
new TableColumn(table, SWT.NONE).setText("记录建立时间");
第四步:设置内容器和标签器

//标签器
public class TableViewerLabelProvider extends LabelProvider implements ITableLabelProvider{

@Override
public Image getColumnImage(Object element, int columnIndex) {
// TODO Auto-generated method stub
return null;
}

@Override
public String getColumnText(Object element, int columnIndex) {
// TODO Auto-generated method stub
if(element instanceof Person){
Person person = (Person)element;
if(columnIndex == 0){
return person.getId().toString();
}else if(columnIndex == 1){
return person.getName();
}else if(columnIndex ==2){
return person.getSex();
}else if(columnIndex == 3){
return person.getAge().toString();
}else if(columnIndex == 4){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(person.getCreateDate());
}
}
return null;
}

}

2 现在还可以实现一些扩展的功能:
相关说明和代码如下:
有一个功能是我们常使用的,就是在列的头上点击一下,整个表的记录按照这个列来排序,再点击一下按照这个列的反序来排序。
在JFace中是通过一个排序器来实现的,就是ViewerSorter,下边写出详细的步骤
2.1、定义一个sorter继承自ViewerSorter
package cn.net.easyway.huang.tableViewer;

import java.util.Date;

import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerSorter;

public class Sorter extends ViewerSorter {
private static final int ID = 1;
private static final int NAME = 2;
private static final int SEX = 3;
private static final int AGE = 4;
private static final int CREATE_DATE = 5;

public static final Sorter ID_ASC = new Sorter(ID);
public static final Sorter ID_DESC = new Sorter(-ID);
public static final Sorter NAME_ASC = new Sorter(NAME);
public static final Sorter NAME_DESC = new Sorter(-NAME);
public static final Sorter SEX_ASC = new Sorter(SEX);
public static final Sorter SEX_DESC = new Sorter(-SEX);
public static final Sorter AGE_ASC = new Sorter(AGE);
public static final Sorter AGE_DESC = new Sorter(-AGE);
public static final Sorter CREATE_DATE_ASC = new Sorter(CREATE_DATE);
public static final Sorter CREATE_DATE_DESC = new Sorter(-CREATE_DATE);

private int sortType ;
private Sorter(int sortType){
this.sortType = sortType;
}
public int compare(Viewer viewer, Object e1, Object e2) {
People p1 = (People)e1;
People p2 = (People)e2;
switch(sortType){
case ID:{
Long l1 = p1.getId();
Long l2 = p2.getId();
return l1.compareTo(l2);
}
case -ID:{
Long l1 = p1.getId();
Long l2 = p2.getId();
return l2.compareTo(l1);
}
case NAME:{
String s1 = p1.getName();
String s2 = p2.getName();
return s1.compareTo(s2);
}
case -NAME:{
String s1 = p1.getName();
String s2 = p2.getName();
return s2.compareTo(s1);
}
case SEX:{
String s1 = p1.getSex();
String s2 = p2.getSex();
return s1.compareTo(s2);
}
case -SEX:{
String s1 = p1.getSex();
String s2 = p2.getSex();
return s2.compareTo(s1);
}
case AGE:{
Integer i1 = p1.getAge();
Integer i2 = p2.getAge();
return i1.compareTo(i2);
}
case -AGE:{
Integer i1 = p1.getAge();
Integer i2 = p2.getAge();
return i2.compareTo(i1);
}
case CREATE_DATE:{
Date d1 = p1.getCreateDate();
Date d2 = p2.getCreateDate();
d1.compareTo(d2);
}
case -CREATE_DATE:{
Date d1 = p1.getCreateDate();
Date d2 = p2.getCreateDate();
d2.compareTo(d1);
}
}
return 0;
}
}
2.2、在TableViewer上,为每一列加入事件监听器类似这样的结构,即在TableViewer的各个newColumnTableCoumn后面加入
newColumnTableColumn.addSelectionListener(new SelectionAdapter(){
boolean asc = true;
public void widgetSelected(SelectionEvent e){
tableViewer.setSorter(asc?Sorter.ID_ASC:Sorter.ID_DESC);
asc = !asc;
}
});

2.2.1,sorter中利用了jdk的compareTo来实现比较,当然也可以根据自己的需求来实现。
2.2.2, sorter中利用了"-"符号来得到正负数字,用来表现升序、降序

3、前边实现了一个表格的基本功能,但这并不够好,下边可以直接编辑的功能。
3.1、要实现这个功能必须提供一个实现ICellModifier的类。内容如下

import org.eclipse.jface.viewers.ICellModifier;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.widgets.TableItem;

public class MyCellModifier implements ICellModifier{
private TableViewer tv;
public static String[] NAMES ={"A","B","C","D"};

public MyCellModifier(TableViewer tv){
this.tv = tv;
}
public boolean canModify(Object element, String property) {
return true;
}

public Object getValue(Object element, String property) {
People p = (People)element;
if(property.equals("name")){
return new Integer(getNameIndex(p.getName()));
}else if(property.equals("sex")){
return new Boolean(p.getSex().equals("male"));
}else if(property.equals("age")){
return String.valueOf(p.getAge());
}
throw new RuntimeException("error column name : " + property);
}
private int getNameIndex(String name){
for(int i=0;i<NAMES.length;i++){
if(NAMES[i].equals(name)){
return i;
}
}
return -1;
}

public void modify(Object element, String property, Object value) {
TableItem item = (TableItem)element;
People p = (People)item.getData();
if (property.equals("name")){
Integer comboIndex = (Integer)value;
if(comboIndex.intValue() == -1){
return ;
}
String newName = NAMES[comboIndex.intValue()];
p.setName(newName);
}else if(property.equals("sex")){
Boolean newValue = (Boolean)value;
System.out.println(newValue);
if(newValue.booleanValue()){
p.setSex("male");
}else{
p.setSex("remale");
}
}else if (property.equals("age")){
String newValue = (String)value;
if(newValue.equals("")){
return ;
}
Integer newAge = new Integer(newValue);
p.setAge(newAge);
}else{
throw new RuntimeException("错误列名:" + property);
}
tv.update(p, null);
}

}
3.2、有了这个类,下一步是如何把它和TestTableViewer关联起来,在TableViewer类中setInput()后加入如下内容
tableViewer.setColumnProperties(new String[]{"id","name","sex","age","createDate"});
CellEditor[] cellEditor = new CellEditor[5];
cellEditor[0] = null;
cellEditor[1] = new ComboBoxCellEditor(tableViewer.getTable(),MyCellModifier.NAMES,SWT.READ_ONLY);
cellEditor[2] = new CheckboxCellEditor(tableViewer.getTable());
cellEditor[3] = new TextCellEditor(tableViewer.getTable());
cellEditor[4] = null;
tableViewer.setCellEditors(cellEditor);
ICellModifier modifier = new MyCellModifier(tableViewer);
tableViewer.setCellModifier(modifier);
//我们让名字这一列用下拉条来编辑,让性别这一列变成类似checkbox的操作,让//年龄这一类变成直接输入
3.3、如果年龄的地方我们输入一个非数字呢,所以为了安全起见,我们加入一个验证器,禁止用户输入非数字
在上边的内容下加入
Text text = (Text)cellEditor[3].getControl();
text.addVerifyListener(new VerifyListener(){
public void verifyText(VerifyEvent e){
String inStr = e.text;
if (inStr.length() > 0){
try{
Integer.parseInt(inStr);
e.doit = true;
}catch(Exception ep){
e.doit = false;
}
}
}
});

4、ViewerFilter这个类是用来进行过滤,如想要显示一些自己需要的记录时,ViewerFilter是一个很好的类,其使用说明如下:
4.1、过滤器代码如下:
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerFilter;

public class MyFilter extends ViewerFilter {
public boolean select(Viewer viewer, Object parentElement, Object element) {
People p = (People) element;
return p.getName().startsWith("黄");
}
}
然后在TableViewer的shell.open前加入这个过滤器
tableViewer.addFilter(new MyFilter());
这样过滤器的
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式