gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:16:57 26 4
gpt4 key购买 nike

如何将标签与相邻复合 Material 第一行中的组合垂直对齐?

标签和多行控件与其他控件位于 GridLayout 中,标签和字段左对齐。多行控件在其他地方重用。

enter image description here

理想情况下,标签和组合中文本的基线应该对齐。实际上,当标签和组合是同级时,使用 SWT.CENTER 将两者垂直居中通常就足够了。

由于字体和外观的差异,我不能只是将标签降低一个编译时常量。

我想到的想法包括:

  • 在运行时,在构造控件时,以某种方式向 Eclipse 询问其组合小部件的高度。将标签嵌入复合 Material 中并适当填充或对齐。
  • 将标签(可能嵌入在 Composite 中)放入带有从未显示的虚拟 Combo 的 StackLayout 中,以便为标签单元格提供同级控件中第一行的高度。将标签在其父标签内居中对齐。

有没有更简单/更干净的方法?

最佳答案

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

此方法具有以下对象:

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 );
}

关于java - 标签与相邻控件的第一行垂直对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31707242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com