In OwnerDrawlabelProvider kann Composite nicht zeichnen
-
21-09-2019 - |
Frage
Ich habe ein TableViewer
Widget mit einer einzelnen Spalte, wobei jede Zeile im Inhalt der Tabelle a ist Composite
mit einer Reihe von Kinderwidgets. Die Spalte verfügt über einen Etikettenanbieter, der eine Unterklasse von ist OwnerDrawLabelProvider
. Der Label -Anbieter soll das rendern Composite
Kinder in der Tabellenzelle, aber wann paint()
wird genannt, nichts wird gerendert.
Ich habe eine Reihe von Beispielen gefunden, wie man einfache oder gestaltete Textelemente zeichnet, oder im Primitiven mit der GC
in dem Event
Objekt übergeben, aber nichts beim Zeichnen des Inhalts von a Composite
im Bereich der Zelle.
Ist das möglich und wenn ja, was mache ich falsch?
Hier ist der Code, um die Tabelle zu erstellen:
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());
Hier sind die measure
und paint
Methoden für den benutzerdefinierten Label -Anbieter, 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();
}
Lösung
Ich denke, InhaberDrawlabelProvider soll verwendet werden, wenn Sie Ihre eigene Komponente mit dem GC zeichnen möchten. Wenn Sie nur ein normales SWT -Widget in einer Tabelle rendern möchten, sollten Sie wahrscheinlich TableDitor und #SetEditor (Steuerung) verwenden, um die Steuerung, die Sie in der Tabellenzelle anzeigen möchten, einzustellen.