如何在相邻Composite的第一行中将标签与Combo垂直对齐?
标签和多行控件位于GridLayout中,带有其他控件,标签和字段左对齐。多行控件在别处重复使用。
理想情况下,标签和组合中文本的基线将对齐。在实践中,当标签和组合是兄弟姐妹时,通过SWT.CENTER垂直居中两者通常就足够了。
由于字体和外观的不同,我不能仅将标签降低编译时常量。
我发现的想法包括:
是否有更简单/更清洁的方法?
答案 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,则可以完全省略标签的创建或全部为空。这样,您可以重复使用带有或不带标签的多组合框组件。