【问题标题】:SWT: How to get a Composite to automatically fill it's containerSWT:如何让 Composite 自动填充它的容器
【发布时间】:2016-05-03 11:22:02
【问题描述】:

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

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

这很好,很漂亮,但我需要这些容器来适应形式给它们的空间。有没有办法做到这一点?任何建议都会有所帮助。

/* (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();   
}

【问题讨论】:

    标签: java layout swt


    【解决方案1】:

    扔掉GridLayoutGridData 并尝试像这样在tabParent 上设置FillLayout

    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 不需要约束对象,只是让它的孩子抓住一切。如果你有多个孩子,我建议你看看RowLayout 了解简单的东西,看看FormLayout 了解复杂的东西,忘记GridLayout

    您也可以摆脱pack() 调用。

    *:既然你给了tabParent 一个GridData 对象,我想你的表单有一个GridLayout。也为你摆脱了它。

    【讨论】:

    • 我可以吻你。这个愚蠢的事情让我难过多久,这甚至都不好笑。老实说,我什至不记得我为什么使用 GridLayout。
    • @Chrus 啊,我很高兴能帮助你。我不知道对 GridLayout 的痴迷从何而来,但我在每个被调用的 SWT 遗留项目中都会遇到这种情况。大多数自定义框架都对其提供广泛的支持,甚至假设所有将要使用的将是 Grid.. 将产品从束缚中解放出来真的很痛苦 :) 祝你有美好的一天!
    【解决方案2】:

    使用

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

    【讨论】:

    • 这没有任何作用。可能是因为画布在表格里面的 tabParent 里面?
    猜你喜欢
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多