Я пытался визуализировать таблицу с помощью 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);
    }
});

Это всегда будет возвращать первое появление индекса в случае наличия каких-либо дубликатов. У меня нет возможности изменять тип имен сотрудников.

Не могли бы вы подсказать, как решить эту проблему с индексом?

0
Echo 5 Апр 2013 в 22:32

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 "";
     }
});
1
david 6 Апр 2013 в 01:51
Спасибо, Дэвид .. Я в долгу перед тобой :)
 – 
Echo
6 Апр 2013 в 14:59