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 );
扔掉 GridLayout
和 GridData
并尝试将 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
。也为你摆脱了那个。
在下面的代码中,我使用了 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 );
扔掉 GridLayout
和 GridData
并尝试将 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
。也为你摆脱了那个。