Question

J'ai un widget TableViewer avec une seule colonne, chaque ligne dans le contenu de la table est un Composite avec un certain nombre de widgets enfants. La colonne a un fournisseur d'étiquettes qui est une sous-classe de OwnerDrawLabelProvider. Le fournisseur d'étiquettes est censé rendre les enfants Composite dans la cellule du tableau, mais quand paint() est appelé, rien est rendu.

Je l'ai trouvé un certain nombre d'exemples sur la façon de dessiner des éléments de texte brut ou de style, ou primitives en utilisant l'GC dans l'objet Event passé, mais rien sur le dessin le contenu d'un Composite dans la zone de la cellule.

Est-ce possible, et si oui, qu'est-ce que je fais mal?

Voici le code pour créer la table:

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

Voici les méthodes de measure et paint pour le fournisseur d'étiquette personnalisée, 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();
    }
Était-ce utile?

La solution

Je pense que OwnerDrawLabelProvider est destiné à être utilisé si vous voulez dessiner votre propre composant à l'aide du GC. Si vous ne souhaitez que un widget SWT normal dans une table, vous devriez probablement utiliser TableEditor et #setEditor (Control) pour régler la commande que vous voulez afficher dans la cellule du tableau.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top