SWT:如何让 Composite 自动填充它的容器

SWT: How to get a Composite to automatically fill it's container

在下面的代码中,我使用了 SWT 和 draw2d。但是当我 运行 该程序时,什么也没有显示。经过一些调试我发现它是因为容器的大小都是0。我必须手动输入一个大小,如

    canvasData.heightHint = 500;
    canvasData.widthHint = 500;

这很好,很花哨,但我需要这些容器来适应表格给它们的 space。有什么办法可以做到这一点?任何建议都会有所帮助。

/* (non-Javadoc)
 * @see org.eclipse.ui.forms.editor.FormPage#createFormContent(org.eclipse.ui.forms.IManagedForm)
 */
@Override
protected void createFormContent( IManagedForm managedForm ) 
{
    super.createFormContent(managedForm);

    ScrolledForm form = managedForm.getForm();  

    Composite tabParent = managedForm.getToolkit().createComposite(form.getBody());
    GridData tabParentData = new GridData(SWT.FILL,SWT.FILL,true,true);
    tabParent.setLayoutData(tabParentData);
    tabParent.setLayout(new GridLayout());

    FigureCanvas canvas = new FigureCanvas(tabParent);
    GridData canvasData = new GridData(SWT.FILL,SWT.FILL,true,true);        
    canvas.setLayoutData(canvasData);

    //diagramContents is an IFigure from draw2d. it holds other IFigures, Labels, ect. 
    //Essentially everything being displayed
    canvas.setContents(diagramContents); 

    //This method is what creates everything being displayed (the stuff in diagramContents)
    refreshDisplayFromModel();

    canvas.pack();  
    tabParent.pack();   
}

使用

canvas.getViewPort().setContentsTracksWidth( true );
canvas.getViewPort().setContentsTracksHeight( true );

扔掉 GridLayoutGridData 并尝试将 FillLayout 设置到 tabParent 上,如下所示:

form.getBody().setLayout(new FillLayout()); //*

Composite tabParent = managedForm.getToolkit().createComposite(form.getBody());
tabParent.setLayout(new FillLayout());

FigureCanvas canvas = new FigureCanvas(tabParent);
//no layouting
canvas.setContents(diagramContents); 

FillLayout 不需要约束 object,只是让它的 child 抓住一切。如果你有多个 child,我建议你看一下 RowLayout 简单的东西和 FormLayout 复杂的东西,而忘记 GridLayout.

您也可以去掉 pack() 调用。

*:因为你给了 tabParent 一个 GridData object,我想你的表格有一个 GridLayout。也为你摆脱了那个。