我有一个 TableViewer 带有单列的小部件,其中表内容中的每一行都是 Composite 有许多儿童小部件。该列的标签提供商是 OwnerDrawLabelProvider. 。标签提供商应该渲染 Composite 餐桌中的孩子,但是什么时候 paint() 被称为,什么都没有渲染。

我发现了许多示例,有关如何绘制普通或样式的文本项目,或使用该示例 GC 在里面 Event 对象传入,但没有绘制一个内容的内容 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();
    }
有帮助吗?

解决方案

我认为,如果您想使用GC绘制自己的组件,则应使用所有者DrawLabelProvider。如果您只想在表中渲染一个普通的SWT小部件,则可能应该使用tableeditor和#seteditor(控件)设置要在表单元格中显示的控件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top