Pergunta

eu tenho um TableViewer widget com uma única coluna, onde cada linha no conteúdo da tabela é um Composite com vários widgets infantis. A coluna possui um provedor de etiquetas que é uma subclasse de OwnerDrawLabelProvider. O provedor de etiquetas deve renderizar o Composite crianças na célula da mesa, mas quando paint() é chamado, nada é renderizado.

Eu encontrei vários exemplos sobre como desenhar itens de texto simples ou estilizados, ou primitivos usando o GC no Event objeto passou, mas nada em desenhar o conteúdo de um Composite na área da célula.

Isso é possível e, se sim, o que estou fazendo de errado?

Aqui está o código para criar a tabela:

    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());

Aqui está o measure e paint Métodos para o provedor de etiquetas personalizadas, 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();
    }
Foi útil?

Solução

Eu acho que o proprietáriodrawlabelprovider deve ser usado se você deseja desenhar seu próprio componente usando o GC. Se você deseja renderizar um widget SWT normal em uma tabela, provavelmente deve usar o Tableeditor e o #SetEditor (Control) para definir o controle que deseja mostrar na célula da tabela.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top