3

単一の列を持つTableViewerウィジェットがあり、テーブルのコンテンツの各行にはComposite、いくつかの子ウィジェットがあります。列には、のサブクラスであるラベルプロバイダーがありOwnerDrawLabelProviderます。ラベルプロバイダーはCompositeテーブルセルの子をレンダリングすることになっていますが、paint()が呼び出されると、何もレンダリングされません。

GC渡されたEventオブジェクトでinを使用して、プレーンまたはスタイル付きのテキストアイテム、またはプリミティブを描画する方法について多くの例を見つけましたCompositeが、セルの領域にaのコンテンツを描画する方法については何もありません。

これは可能ですか?もしそうなら、私は何を間違っていますか?

テーブルを作成するためのコードは次のとおりです。

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

カスタムラベルプロバイダーのメソッドmeasureとメソッドは次のとおりです。paintCompositeLabelProvider

    @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();
    }
4

1 に答える 1

2

OwnerDrawLabelProviderは、GCを使用して独自のコンポーネントを描画する場合に使用することを目的としています。テーブルで通常のSWTウィジェットのみをレンダリングする場合は、TableEditorと#setEditor(Control)を使用して、テーブルセルに表示するコントロールを設定する必要があります。

于 2010-02-21T23:03:00.490 に答える