标签与相邻控件的第一行垂直对齐

时间:2015-07-29 17:28:15

标签: java layout swt eclipse-rcp

如何在相邻Composite的第一行中将标签与Combo垂直对齐?

标签和多行控件位于GridLayout中,带有其他控件,标签和字段左对齐。多行控件在别处重复使用。

enter image description here

理想情况下,标签和组合中文本的基线将对齐。在实践中,当标签和组合是兄弟姐妹时,通过SWT.CENTER垂直居中两者通常就足够了。

由于字体和外观的不同,我不能仅将标签降低编译时常量。

我发现的想法包括:

  • 在运行时,在构造控件时,请以某种方式向Eclipse询问其组合小部件的高度。将标签嵌入复合材料和垫中或适当对齐。
  • 将标签(可能嵌入Composite中)放在StackLayout中,并使用一个永不显示的虚拟组合,为标签单元格提供兄弟控件中第一行的高度。居中将标签对齐其父级。

是否有更简单/更清洁的方法?

2 个答案:

答案 0 :(得分:1)

我确认问题可以通过我在问题中提出的第二种方法来解决。 如果有人有更好的答案,请发帖。

这种方法有以下几个目标:

AbstractLabelWithHeightOfAnotherControl / custom StackLayout
    <>-- Other control 
         Composite / GridLayout
            <>-- Label / GridData( SWT.BEGINNING, SWT.CENTER, false, true )

自定义StackLayout具有标签的宽度,但是具有另一个控件的高度。

此代码提供了一个抽象类,支持各种其他控件的行为。

public abstract class AbstractLabelWithHeightOfAnotherControl extends Composite {

private Label m_label;
private Control m_otherControl;

/** Constructor.
 * @param parent
 * @param style
 */
public AbstractLabelWithHeightOfAnotherControl(Composite parent, int style) {
    super( parent, style );

    StackLayout stackLayout = new MyStackLayout();
    this.setLayout( stackLayout );

    Composite layerLabel = new Composite( this, SWT.NONE );
    GridLayout layerLabelLayout = new GridLayout( 1, false );
    layerLabelLayout.marginWidth = 0;
    layerLabelLayout.marginHeight = 0;
    layerLabel.setLayout( layerLabelLayout );
    m_label = new Label( layerLabel, SWT.NONE);
    m_label.setLayoutData( new GridData( SWT.BEGINNING, SWT.CENTER, false, true ) );

    m_otherControl = makeOtherControl( this );

    stackLayout.topControl = layerLabel;
}

protected abstract Control makeOtherControl( @Nonnull Composite parent );

public Label getLabel() {
    return m_label;
}

private final class MyStackLayout extends StackLayout {
    MyStackLayout() {
        this.marginHeight = 0;
        this.marginWidth = 0;
    }

    @Override
    protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
        int width = m_label.computeSize( wHint, hHint, flushCache ).x;
        int height = m_otherControl.computeSize( wHint, hHint, flushCache ).y;

        if (wHint != SWT.DEFAULT) width = wHint;
        if (hHint != SWT.DEFAULT) height = hHint;
        return new Point(width, height);
    }
}
}

实现类可以提供这样的方法:

@Override
protected Control makeOtherControl( @Nonnull Composite parent ) {
    return new Combo( parent, SWT.NONE );
}

答案 1 :(得分:0)

如何创建这样的组件:

+-------------------------------+ 
| +---------------------------+ |
| |  +------+ +-------------+ | |
| |  |Label | |Combobox     | | |
| |  +------+ +-------------+ | |
| +---------------------------+ |
| |  +------+ +-------------+ | |
| |  |Dummy | |Combobox     | | |
| |  +------+ +-------------+ | |
| +---------------------------+ |
| |  +------+ +-------------+ | |
| |  |Dummy | |Combobox     | | |
| |  +------+ +-------------+ | |
| +---------------------------+ |
+-------------------------------+ 

通过将标签文本作为输入的方法创建它。如果你愿意,傻瓜是空标签。如果方法标签文本为null,则可以完全省略标签的创建或全部为空。这样,您可以重复使用带有或不带标签的多组合框组件。