Java SWT在表单中动态绘制表

Java SWT在表单中动态绘制表,java,eclipse,swt,dynamically-generated,Java,Eclipse,Swt,Dynamically Generated,我有一个窗体,在窗体的某个部分,工具栏上有一个操作。 运行该操作将导致以动态列和行的形式绘制swt表 问题是,我能够做到这一点的唯一方法是首先创建一个空表,然后将表句柄传递给操作,该操作稍后将填充它 如果我有绘制表格的操作代码,表单不会展开(滚动)以显示整个表格 是否有任何方法可以在不创建初始表的情况下实现我想要的 我使用组合的代码如下所示: 要在窗体构造中创建组合,请执行以下操作: gd = new GridData(); gd.widthHint = 400; gd.

我有一个窗体,在窗体的某个部分,工具栏上有一个操作。 运行该操作将导致以动态列和行的形式绘制swt表

问题是,我能够做到这一点的唯一方法是首先创建一个空表,然后将表句柄传递给操作,该操作稍后将填充它

如果我有绘制表格的操作代码,表单不会展开(滚动)以显示整个表格

是否有任何方法可以在不创建初始表的情况下实现我想要的

我使用组合的代码如下所示: 要在窗体构造中创建组合,请执行以下操作:

    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);
GridData gd=new GridData();
gd.1=400;
gd.heightHint=200;
如果(this.viewer!=null){
this.viewer.getTable().setRedraw(false);
而(this.viewer.getTable().getColumnCount()>0){
this.viewer.getTable().getColumns()[0].dispose();
}
this.viewer.getTable().dispose();
this.viewer=null;
}
this.viewer=新的TableViewer(复合,SWT.BORDER
|SWT.全方位选择);
this.viewer.setContentProvider(新特性ContentProvider());
this.viewer.setLabelProvider(新特性LabelProvider());
this.viewer.getTable().setLayoutData(gd);
this.viewer.getTable().setheadervible(true);
this.viewer.getTable().redraw();
this.viewer.refresh();
List columnNames=getColumnNamesForTable();
for(字符串名称:columnNames){
TableColumn c=新的TableColumn(this.viewer.getTable(),SWT.NONE);
c、 setText(姓名);
c、 设定宽度(100);
}
this.viewer.getTable().redraw();
this.viewer.refresh();
this.viewer.setInput(迭代);
这个.composite.layout(true,true);

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

我会这样做:

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

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

  • 使用占位符组合作为父项创建

  • 创建列并填充表

  • 在表单(或顶级组合)上调用
    layout(true,true)
    ,以显示表格

编辑

从我对代码的了解来看,您至少需要将布局设置为
表格组合

tableComposite.setLayout(GridLayoutFactory.fillDefaults().create());
并且应该在更高的级别上进行重新调整(可能使用
getParent()
一次或多次,直到达到顶级组合,但如果将其作为字段,则效果会更好)。例如:

this.composite.getParent().layout(true, true);

我会这样做:

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

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

  • 使用占位符组合作为父项创建

  • 创建列并填充表

  • 在表单(或顶级组合)上调用
    layout(true,true)
    ,以显示表格

编辑

从我对代码的了解来看,您至少需要将布局设置为
表格组合

tableComposite.setLayout(GridLayoutFactory.fillDefaults().create());
并且应该在更高的级别上进行重新调整(可能使用
getParent()
一次或多次,直到达到顶级组合,但如果将其作为字段,则效果会更好)。例如:

this.composite.getParent().layout(true, true);

上述代码中缺少的是
组合
重画

this.composite.redraw();

上述代码中缺少的是
组合
重画

this.composite.redraw();

更好的解决办法应该是:

1) 在表单创建过程中添加空表
2) 通过将表的
GridData
Exclude
属性设置为true,将表从UI中排除
3) 需要时,将列和行添加到表中
4) 将
exclude
属性设置为
false


5) 重新绘制或布局表的容器。

更好的解决方案应该是:

1) 在表单创建过程中添加空表
2) 通过将表的
GridData
Exclude
属性设置为true,将表从UI中排除
3) 需要时,将列和行添加到表中
4) 将
exclude
属性设置为
false


5) 重新绘制或
layout
table的容器。

我尝试了这种方法,我创建了一个组合,形式为:tableComposite=newcomposite(parentComposite,SWT.None);然后我将tableComposite传递给action。操作代码如下:this.viewer=newtableviewer(composite,SWT.BORDER | SWT.FULL_SELECTION);this.viewer.setContentProvider(新特性ContentProvider());this.viewer.setLabelProvider(新特性LabelProvider());this.viewer.getTable().setLayoutData(gd);this.viewer.getTable().setheadervible(true);this.viewer.getTable().redraw();this.viewer.refresh();thic.composite.layout(true,true),但仍然没有显示…请在您的问题中发布代码,它将更具可读性。另外,我想你忘了将布局设置为
tableComposite
我尝试了你的建议,但仍然没有显示该表。。。我真的不明白为什么…@user847988对不起,不知道了。在这些情况下,我通常会在合成图中添加边框、边距和背景色,以帮助找出缺少的内容。请在需要时发布解决方案