1

フォームのセクションにツールバーのアクションがあるフォームがあります。アクションを実行すると、動的な列と行を含むフォームに swt テーブルが描画されます。

問題は、私がこれを行う唯一の方法は、最初に空のテーブルを作成し、後でテーブル ハンドルをアクションに渡すことです。

テーブルを描画するアクション コードがある場合、フォームはテーブル全体を表示するために展開 (スクロール) しません。

初期テーブルを作成せずに私が望むものを達成する方法はありますか?

Composite を使用しているコードは次のようなものです: フォーム構築でコンポジットを作成する場合:

    gd = new GridData();
    gd.widthHint = 400;
    gd.heightHint = 200;

    tableComposite = new Composite(this.client, SWT.None);
    tableComposite.setLayoutData(gd);

アクション コード内:

        GridData gd = new GridData();
    gd.widthHint = 400;
    gd.heightHint = 200;

    if (this.viewer != null) {
        this.viewer.getTable().setRedraw(false);

        while (this.viewer.getTable().getColumnCount() > 0) {
            this.viewer.getTable().getColumns()[0].dispose();
        }
        this.viewer.getTable().dispose();
        this.viewer = null;
    }
    this.viewer = new TableViewer(composite, SWT.BORDER
            | SWT.FULL_SELECTION);
    this.viewer.setContentProvider(new FeatureContentProvider());
    this.viewer.setLabelProvider(new FeatureLabelProvider());
    this.viewer.getTable().setLayoutData(gd);
    this.viewer.getTable().setHeaderVisible(true);
    this.viewer.getTable().redraw();
    this.viewer.refresh();

    List<String> columnNames = getColumnNamesForTable();
    for (String name : columnNames) {
        TableColumn c = new TableColumn(this.viewer.getTable(), SWT.NONE);
        c.setText(name);
        c.setWidth(100);
    }

    this.viewer.getTable().redraw();
    this.viewer.refresh();

    this.viewer.setInput(iterations);
    this.composite.layout(true, true);

ここで、composite は、アクション コードのフォームから渡されるパラメーターです。テーブルが割り当てられているようで、コンポジット用のスペースもありますが、表示されていません。

4

3 に答える 3

1

私はこのようにします:

  • Compositeフォーム作成時にテーブルを追加したい位置に空欄(プレースホルダー)を作成します。テーブルが追加されるまで表示されません。

  • テーブルを作成する必要がある場合は、プレースホルダー コンポジットのすべての子を破棄します (たとえば、前のテーブルを削除するため)。

  • Tableプレースホルダー コンポジットを親として使用して を作成する

  • 列を作成してテーブルに入力する

  • layout(true, true)フォーム (または最上位の Composite) を呼び出して、テーブルを表示します。

編集

私があなたのコードを見たところ、少なくともレイアウトを次のように設定する必要がありますtableComposite

tableComposite.setLayout(GridLayoutFactory.fillDefaults().create());

また、再レイアウトは上位レベルで行う必要があります (getParent()最上位のコンポジットに到達するまで、おそらく 1 回または数回使用しますが、フィールドとして使用する方がよいでしょう)。例:

this.composite.getParent().layout(true, true);
于 2012-11-13T09:13:21.253 に答える
0

上記のコードに欠けているのはredraw、次の部分Compositeです。

this.composite.redraw();
于 2012-11-13T12:47:16.580 に答える