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();
    }
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top