使用等高行创建GridLayout

时间:2017-04-20 08:43:28

标签: java layout eclipse-plugin swt

我希望复合材料带有一些标签,所有标签应该具有相同的高度,但它们应该垂直居中。

到目前为止,我有以下内容:

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

    final Composite composite = new Composite(shell, SWT.VERTICAL);
    composite.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(true).spacing(0, 0).create());
    for (int i = 0; i < 10; i++) {
        final Label label = new Label(composite, SWT.WRAP);
        label.setAlignment(SWT.CENTER);
        label.setText(i < 5 ? "small " + i : "a very big text for the row that is named " + i);
        label.setToolTipText(label.getText());
        label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).grab(true, true).create());
    }

    shell.setSize(100, 600);
    shell.open();

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

正如您所看到的,标签在它们的行中是垂直居中的,但是包裹的标签比其他标签占用更多的空间。

如果我将hint(SWT.DEFAULT, 60)添加到GridData,我可以强制标签具有相同的高度,但之后它们将不再垂直居中。

我可以将复合材料中的所有标签包起来,在复合材料上设置高度提示并使标签居中,但让我们先看看另一种选择。

如何创建高度相等的垂直居中行?

1 个答案:

答案 0 :(得分:3)

由于您尝试统一排列可能不同大小的小部件,我认为一个很好的选择是将每个Label放入Composite。这样,每个Composite可以具有相同的大小,Label将集中在其中。

通过向父ControlListener添加Composite,您可以检查每个子项Composite的大小,然后将每个子项的高度提示设置为最大子项的高度:

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

    final Composite composite = new Composite(shell, SWT.VERTICAL);
    composite.setLayout(GridLayoutFactory.fillDefaults().numColumns(1).equalWidth(true).spacing(0, 0).create());

    final List<Composite> children = new ArrayList<Composite>();
    for (int i = 0; i < 10; i++) {
        final Composite c = new Composite(composite, SWT.BORDER);
        c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        c.setLayout(new GridLayout());

        final Label label = new Label(c, SWT.WRAP);
        label.setAlignment(SWT.CENTER);
        label.setText(i < 5 ? "small " + i : "a very big text for the row that is named " + i);
        label.setToolTipText(label.getText());
        label.setLayoutData(GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.CENTER).grab(true, true).create());

        children.add(c);
    }

    composite.addControlListener(new ControlAdapter() {
        @Override
        public void controlResized(final ControlEvent e) {
            int maxHeight = 0;
            for (final Composite c : children) {
                if (c.getClientArea().height > maxHeight) {
                    maxHeight = c.getClientArea().height;
                }
            }
            for (final Composite c : children) {
                ((GridData) c.getLayoutData()).heightHint = maxHeight;
            }
        }
    });

    shell.setSize(100, 600);
    shell.open();

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

结果:

enter image description here

调整大小后:

enter image description here enter image description here