3

我有一个TableViewer带有单列的小部件,其中表格内容中的每一行都是一个Composite带有许多子小部件的小部件。该列有一个标签提供程序,它是 的子类OwnerDrawLabelProvider。标签提供者应该Composite在表格单元格中呈现子元素,但是当paint()被调用时,不会呈现任何内容。

我找到了许多关于如何使用传入GC的对象中绘制纯文本或样式文本项或原语的示例,但没有在单元格区域中Event绘制 a 的内容。Composite

这是可能的,如果是这样,我做错了什么?

下面是创建表的代码:

    viewer = new TableViewer(container, SWT.NONE);
    final Table table = viewer.getTable();

    TableViewerColumn viewerColumn = new TableViewerColumn(viewer, SWT.LEFT);
    TableColumn tableColumn = viewerColumn.getColumn();
    tableColumn.setText(Messages.getString("column.header.name"));
    tableColumn.setResizable(true);
    tableColumn.setMoveable(false);
    tableColumn.setWidth(500);
    viewerColumn.setLabelProvider(new CompositeLabelProvider());

以下是自定义标签提供程序的measurepaint方法CompositeLabelProvider

    @Override
    protected void measure(Event event, Object element) {

        CompositeTableItem row = rowMap.get(element);
        Composite contents = row.getContents(viewer.getTable().getParent());
        Point size = contents.computeSize(SWT.DEFAULT, SWT.DEFAULT);
        event.setBounds(new Rectangle(event.x, event.y, size.x, size.y));
    }

    @Override
    protected void paint(Event event, Object element) {

        CompositeTableItem row = rowMap.get(element);
        Composite contents = row.getContents(viewer.getTable().getParent());

        contents.redraw(event.getBounds().x, event.getBounds().y, event.getBounds().width, event.getBounds().height, true);

        contents.update();
    }
4

1 回答 1

2

我认为如果您想使用 GC 绘制自己的组件,则可以使用 OwnerDrawLabelProvider。如果您只想在表格中呈现普通的 SWT 小部件,您可能应该使用 TableEditor 和 #setEditor(Control) 来设置要在表格单元格中显示的控件。

于 2010-02-21T23:03:00.490 回答