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

其中复合是从动作代码中的表单传递的参数。该表似乎已分配,复合空间也已分配,但未显示。

4

3 回答 3

1

我会这样做:

  • Composite在要添加表格的位置(占位符)创建表单时创建一个空白。在添加表格之前,它将不可见。

  • 当您需要创建表时,处置占位符组合的所有子项(例如,删除以前的表)

  • Table使用占位符复合作为父级创建

  • 创建列并填充表格

  • 调用layout(true, true)表格(或顶级复合材料)以显示表格。

编辑

根据我对您的代码的了解,您至少需要将布局设置为tableComposite

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

并且重新布局应该在更高级别完成(可能使用getParent()一次或多次,直到您达到顶级复合材料,但如果您将它作为一个字段会更好)。例子:

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

更好的解决方案应该是:

1) 在创建表单时添加空表2) 通过将表的属性设置为 true
从 UI 中排除表 3) 需要时向表中添加列和行 4) 将属性设置为 5) 重绘或表的容器。excludeGridData

excludefalse
layout

于 2013-04-13T22:09:05.717 回答
0

上面的代码中缺少的redrawComposite

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