jFace CheckboxTableViewer 和内容提供者

jFace CheckboxTableViewer and content provider

我是 jFace 的新手。我使用以下 TableViewer Class 作为示例:

public class AppPersonViewer extends TableViewer
{
    public Table table;

    public AppPersonViewer(Composite parent, int style) 
    {
        super(parent, style);
        table = getTable();
        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        table.setLayoutData(gridData);
        createColumns();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        setContentProvider(new AppContentProvider());
    }

    private void createColumns()
    {
        String[] titles = { "First Name", "Second Name", "Age", "Country", "Likes SO" };
        int[] bounds = { 150, 150, 100, 150, 100 };

        TableViewerColumn column = createTableViewerColumn(titles[0], bounds[0], 0);
        column.setLabelProvider(new ColumnLabelProvider(){
            public String getText(Object element) {
                if(element instanceof Person)
                    return ((Person)element).getFirst();
                return super.getText(element);
            }
        });

        column = createTableViewerColumn(titles[1], bounds[1], 1);
        column.setLabelProvider(new ColumnLabelProvider(){
            public String getText(Object element) {
                if(element instanceof Person)
                    return ((Person)element).getSecond();
                return super.getText(element);
            }
        });

        column = createTableViewerColumn(titles[2], bounds[2], 2);
        column.setLabelProvider(new ColumnLabelProvider(){
            public String getText(Object element) {
                if(element instanceof Person)
                    return ""+((Person)element).getAge();
                return super.getText(element);
            }
        });

        column = createTableViewerColumn(titles[3], bounds[3], 3);
        column.setLabelProvider(new ColumnLabelProvider(){
            public String getText(Object element) {
                if(element instanceof Person)
                    return ((Person)element).getCountry();
                return super.getText(element);
            }
        });

        column = createTableViewerColumn(titles[4], bounds[4], 4);
        column.setLabelProvider(new ColumnLabelProvider(){
            public Image getImage(Object element) {
                    return ((Person)element).getImage();
            }

            public String getText(Object element) {
                  return null;  // no string representation, we only want to display the image
                }

        });


    }

    private TableViewerColumn createTableViewerColumn(String header, int width, int idx) 
    {
        TableViewerColumn column = new TableViewerColumn(this, SWT.LEFT, idx);
        column.getColumn().setText(header);
        column.getColumn().setWidth(width);
        column.getColumn().setResizable(true);
        column.getColumn().setMoveable(true);

        return column;
    }
}

这个例子效果很好。现在我想在每个 table 行的第一列中显示复选框。 (在本机 SWT 中,标志 SWT.CHECK 可以做到这一点)。

经过一番搜索,我找到了 class CheckboxTableViewer。所以我将示例更改为:

public class AppPersonViewer extends CheckboxTableViewer
{
    public Table table;

    public AppPersonViewer(Composite parent, int style) 
    {
        super(parent, style);
        table = getTable();
        GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true);
        table.setLayoutData(gridData);
        createColumns();
        table.setHeaderVisible(true);
        table.setLinesVisible(true);
        setContentProvider(new AppContentProvider());
    }

  .
  .
  .

现在显示了复选框,但我不知道如何在我的内容提供程序中使用复选框。任何的想法?

CheckboxTableViewer使用单独的ICheckStateProvider来设置复选框。

设置为

viewer.setCheckStateProvider(checkStateProvider);

提供商有两种方法isCheckedisGrayed

传递给这些方法的值是来自您的内容提供商的对象。

或者 CheckboxTableViewersetCheckedsetAllChecked、...方法。