Incapable de tirer composite OwnerDrawLabelProvider
-
21-09-2019 - |
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();
}
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.