使用JFace渲染表中重复元素的索引

时间:2013-04-05 18:32:53

标签: java eclipse jface

我一直在尝试使用jface渲染表格。 问题是我呈现的列之一保存数组内元素的索引。 我做了以下的事情:

TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
tableViewerColumn.setLabelProvider(new ColumnLabelProvider() {      
    public String getText(Object object) {
        //EmployeeNames is list of String
        return String.valueOf(company.getEmployeeNames().indexOf(object)+ 1);
    }
});

如果有任何dublicates,这将始终返回第一个索引出现。 我没有办法改变EmployeeNames的类型。

你能否给我一个处理这个索引问题的提示!

1 个答案:

答案 0 :(得分:1)

解决方案1:细胞指数

这里有一个小类,可以用作列标签提供程序来显示JFace TableViewer中的行号。

基本上它不会查找与单元格关联的对象的索引,而是查找单元格本身的索引。

import java.util.Arrays;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.jface.viewers.ViewerColumn;

public class RowNumberLabelProvider extends CellLabelProvider {

    private TableViewer viewer;

    protected void initialize(ColumnViewer viewer, ViewerColumn column) {
        super.initialize(viewer, column);
        this.viewer = null;
        if (viewer instanceof TableViewer) {
            this.viewer = (TableViewer) viewer;
        }
    }

    public void update(ViewerCell cell) {
        super.update(cell);
        if (viewer != null) {
            int index = Arrays.asList(viewer.getTable().getItems()).indexOf(cell.getItem());
            cell.setText("" + (index + 1));
        }
    }
}

要使用它,只需将其设置为列的标签提供者

即可
TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
tableViewerColumn.setLabelProvider(new RowNumberLabelProvider());

我不确定当启用过滤器或表已排序时它是否也能正常工作。


解决方案2:按参考搜索

作为替代方案,您还可以尝试通过引用来查找对象:

 TableViewerColumn tableViewerColumn = new TableViewerColumn(tableViewer, SWT.NONE);
 tableViewerColumn.setLabelProvider(new ColumnLabelProvider() {

     public String getText(Object object) {
         int index = 1;
         for (String employee : company.getEmployeeNames()) {
             if (employee == object) 
                 return String.valueOf(index);
             index++;
         }
         return "";
     }
});