Java,SWT,FormLayout - 为什么我添加子项的顺序很重要?

时间:2012-08-21 07:08:47

标签: java swt form-layout

我正在使用FormLayout作为Composite容器。 当我添加两个孩子标签 clientArea 时,clientArea依赖于标签 - 只有在我首先添加标签时才会出现clientArea。

在添加子项后调用容器上的layout()没有帮助 - clientArea不会显示。

如何将子项添加到FormLayout控制的容器中,与彼此的依赖项无关?

MyLabel label;
Composite clientArea;   

public MyContainer(Composite parent, int style) {
    super(parent,style);

    //choose the container Layout
    FormLayout layout = new FormLayout();
    this.setLayout(layout);


    clientArea = new Composite(this, SWT.NONE);
    FormData formData4ClientArea = new FormData();
    formData4ClientArea.left = new FormAttachment(0,0);
    formData4ClientArea.top = new FormAttachment(0,5);
    formData4ClientArea.right = new FormAttachment(label,-5);
    formData4ClientArea.bottom = new FormAttachment(100,-5);
    //set the Formdata
    clientArea.setLayoutData(formData4ClientArea);
    clientArea.setBackground(getDisplay().getSystemColor(SWT.COLOR_GREEN));     


    //create the label
    label = new MyLabel(this, SWT.NONE);
    FormData formData4Label = new FormData();
    formData4Label.top = new FormAttachment(0,5);
    formData4Label.right = new FormAttachment(100,-5);
    formData4Label.bottom = new FormAttachment(100,-5);
    //set the FormData
    label.setLayoutData(formData4Label);

2 个答案:

答案 0 :(得分:5)

formData4ClientArea.right = new FormAttachment(label,-5);此时,labelnull。它没有实例化。所以基本上你将clientArea附加到任何东西。如果您希望将clientArea附加到label,则需要首先实例化label,然后clientArea

但是,另一方面,为什么订单对你很重要?

答案 1 :(得分:1)

实际上,实例化组件的顺序无关紧要。

您不能做的是在创建对象之前引用它。正如Plygnome所说,问题在于,当您创建FormAttachment时,Labelnull

在我们的项目中,我们首先创建所有组件,然后创建所有布局数据对象。