gpt4 book ai didi

java - 使用等高的行创建 GridLayout

转载 作者:行者123 更新时间:2023-11-30 07:55:07 25 4
gpt4 key购买 nike

我想要一个带有一些标签的合成图,所有标签的高度应该相同,但它们应该垂直居中。

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

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,我可以强制标签具有相同的高度,但它们不会不再垂直居中。

我可能可以将所有标签包裹在复合 Material 中,在复合 Material 上设置高度提示并使标签居中,但让我们先看看还有另一种选择。

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

最佳答案

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

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

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

关于java - 使用等高的行创建 GridLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43514471/

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