gpt4 book ai didi

java - 多个复合 Material 之间第一列的宽度相等

转载 作者:行者123 更新时间:2023-12-02 05:31:23 26 4
gpt4 key购买 nike

所以情况是我有一个 SWT 复合 A,它聚合了复合 B 和 C。B和C的内容由多行组成,其中包括Label和Text。在复合 B 或​​ C 行中正确对齐(您可以在标签边框结束和文本开始的位置绘制一条垂直线)。但如果你比较 B 和 C,那么 C 的内容看起来像是针对 B 缩进的。

例如:

enter image description here

有人知道如何实现它吗?

最佳答案

我能想到的对齐每个Composite的第一列的唯一方法是将GridData#widthHint设置为相同的值。该值必须是第一列中任何元素的最大宽度。

我尝试了一下并提出了这个解决方案(它没有优化,因此可能不是最有效的方法):

private static Random random = new Random(System.currentTimeMillis());

public static void main(String[] args)
{
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("StackOverflow");
shell.setLayout(new GridLayout(1, false));

Composite first = createComposite(shell);
Composite second = createComposite(shell);

synchronizeFirstColumn(2, first, second);

shell.pack();
shell.open();

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

private static Composite createComposite(Shell shell)
{
Composite comp = new Composite(shell, SWT.BORDER);

comp.setLayout(new GridLayout(2, false));
comp.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

for (int i = 0; i < 3; i++)
{
String content = UUID.randomUUID().toString();
content = content.substring(0, Math.round(random.nextFloat() * content.length()));

Label label = new Label(comp, SWT.RIGHT);
label.setText(content);
label.setLayoutData(new GridData(SWT.END, SWT.TOP, false, false));

Text text = new Text(comp, SWT.BORDER);
text.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false));
}

return comp;
}

private static void synchronizeFirstColumn(int nrOfColumns, Composite... comps)
{
if (comps == null || comps.length == 0)
return;

int maxWidth = 0;

for (Composite comp : comps)
{
Control[] controls = comp.getChildren();

for (int i = 0; i < controls.length; i += nrOfColumns)
{
int width = controls[i].computeSize(SWT.DEFAULT, SWT.DEFAULT).x;

if (width > maxWidth)
maxWidth = width;
}
}


for (Composite comp : comps)
{
Control[] controls = comp.getChildren();

for (int i = 0; i < controls.length; i += nrOfColumns)
{
Object data = controls[i].getLayoutData();

if(data instanceof GridData)
{
GridData grid = (GridData) data;

grid.widthHint = maxWidth;
}
}
}
}

看起来像这样:

enter image description here

关于java - 多个复合 Material 之间第一列的宽度相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25502314/

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