儿童复合材料没有出现在布局中

时间:2013-04-04 19:16:47

标签: java swt

我正在尝试构建一个GUI,其中多个复合材料垂直布局。我把我的方法放在一个最小的例子中:

public class LayoutTest {

    public static void main(String[] args) {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setSize(400, 300);
        shell.setLayout(new FillLayout());

        Composite listPanel = new ScrolledComposite(shell, SWT.BORDER
                | SWT.V_SCROLL);
        listPanel.setLayout(new RowLayout(SWT.VERTICAL));
        listPanel.setBackground(Display.getCurrent().getSystemColor(
                SWT.COLOR_WHITE));

        for (int i = 1; i < 5; i++) {

            Composite listElement = new Composite(listPanel, SWT.BORDER);
            listElement.setLayout(new RowLayout());

            Label label = new Label(listElement, SWT.BORDER);
            label.setText(String.valueOf(i) + "     foo");
            label.setSize(label.computeSize(SWT.DEFAULT, SWT.DEFAULT));

            listElement.setSize(label.computeSize(shell.getSize().x,
                    label.getSize().y));
        }

        shell.layout(true, true);

        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }
}

您可以看到某些复合材料是在循环中创建的。问题是只有第一个出现在UI中。我希望它们在彼此之下,因为它的父母有一个垂直RowLayout

我也尝试过其他方法。一个是一列GridLayout,另一个是FormLayout,其中我将每个孩子的顶部附件设置为前一个。两者都表现出完全相同的结果。

有谁知道我做错了什么?

1 个答案:

答案 0 :(得分:1)

你去了:

public static void main(String[] args)
{
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new GridLayout(1, false));

    ScrolledComposite listPanel = new ScrolledComposite(shell, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL);
    listPanel.setLayout(new GridLayout(1, false));

    Composite child = new Composite(listPanel, SWT.NONE);
    child.setLayout(new GridLayout(2, false));

    for (int i = 1; i < 10; i++)
    {
        Button button = new Button(child, SWT.PUSH);
        button.setText("lalala");

        Label label = new Label(child, SWT.BORDER);
        label.setText(i + "     foo");
    }

    Point size = child.computeSize(SWT.DEFAULT, SWT.DEFAULT);

    listPanel.setContent(child);
    listPanel.setMinSize(size.x, size.y);
    listPanel.setExpandHorizontal(true);
    listPanel.setExpandVertical(true);

    shell.pack();
    shell.open();
    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

缺少的重要部分是:

listPanel.setContent(child);
listPanel.setMinSize(size.x, size.y);
listPanel.setExpandHorizontal(true);
listPanel.setExpandVertical(true);