質問

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

プレーンまたはスタイルのテキストアイテムを描く方法、または次のようにプリミティブを使用して、いくつかの例を見つけました。 GC の中に Event オブジェクトが渡されましたが、の内容を描画することはありません Composite セルの領域で。

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

これがテーブルを作成するコードです。

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

ここにあります measurepaint カスタムラベルプロバイダーの方法、 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();
    }
役に立ちましたか?

解決

GCを使用して独自のコンポーネントを描画したい場合は、ownerdrawlabelproviderを使用することを意図していると思います。テーブルに通常のSWTウィジェットをレンダリングしたい場合は、おそらくテーブルエディターと#SetEditor(コントロール)を使用して、テーブルセルに表示するコントロールを設定する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top