手动限制复合中的SWT布局

时间:2014-11-27 21:40:32

标签: java swt

我有以下代码:

public static void main(String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);

    Composite parent = new Composite(shell, SWT.NONE);
    parent.setBounds(20, 20, 400, 300);//since shell doesn't have a layout
    parent.setLayout(new FillLayout(SWT.HORIZONTAL|SWT.VERTICAL));

    Composite child = new Composite(parent, SWT.BORDER);
    child.setLayout(new GridLayout(2, true));

    Label l = new Label(child, SWT.NONE);
    l.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
    l.setText("BLOB-BLOB-BLOB!");

    Button button = new Button(child, SWT.PUSH);
    button.setLayoutData(new GridData(SWT.BEGINNING, SWT.CENTER, false, false));
    button.setText("TEEEEXTTTT");


    shell.setSize(500, 500);
    shell.open();

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

所以,我认为我会将一个父复合作为(20,20,400,300),因为shell没有布局和子复合填充父,因为它有一个FillLayout。 但我只有一个父母正确。而且我必须为shell设置布局或者为每个控件设置每个边界,尽管已经设置了布局。为什么布局在这种情况下不起作用?

1 个答案:

答案 0 :(得分:1)

如果在打开之前在shell上强制布局,则所有内容都会按预期显示:

shell.setSize( 500, 500 );
shell.layout( true, true ); // force layout
shell.open();

我不确定为什么layout()电话是必要的。但我通常也不会使用绝对位置......

作为旁注:FillLayout SWT.HORIZONTAL SWT.VERTICAL。指定两者都没有意义。