Impossibile disegnare Composite in OwnerDrawLabelProvider
-
21-09-2019 - |
Domanda
Ho un widget di TableViewer
con una sola colonna, dove ogni riga il contenuto della tabella è un Composite
con una serie di widget figlio. La colonna ha un fornitore di etichetta che è una sottoclasse di OwnerDrawLabelProvider
. Il provider etichetta è supposto per rendere i bambini Composite
nella cella di una tabella, ma quando paint()
si chiama, nulla è reso.
ho trovato una serie di esempi su come disegnare elementi semplici o stile di testo o primitive che utilizzano il GC
nell'oggetto Event
passata, ma niente a disegnare il contenuto di una Composite
nella zona della cella.
Questo è possibile, e se sì, che cosa sto facendo male?
Ecco il codice per creare la tabella:
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());
Questi sono i metodi measure
e paint
per il provider di etichetta personalizzata, 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();
}
Soluzione
Credo OwnerDrawLabelProvider è pensato per essere utilizzato se si vuole disegnare il proprio componente con il GC. Se si desidera solo rendere un normale widget di SWT in una tabella, probabilmente si dovrebbe usare TableEditor e #setEditor (Control) per impostare il controllo che si desidera visualizzare nella cella della tabella.