1
我想要一個帶有一些標籤的組合,並且所有標籤都應該具有相同的高度,但它們應該垂直居中。使用等高的行創建GridLayout
到目前爲止,我有以下幾點:
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
,我可以強制標籤具有相同的高度,但它們不會再被垂直居中。
我可能會將所有標籤包裹在複合材料中,在複合材料上設置高度提示並將標籤居中,但讓我們先看看另一個選項。
如何創建垂直居中的等高行?
這似乎只是巧合。 'Composite.getClientArea()。y'是它的y座標,而不是它的高度。您需要執行'getClientArea()。height'或'getSize()。y'。 – mapeters
另外,對於我來說,'getClientArea()。height'和'getSize()。y'總是爲0. – mapeters
@mapeters好的catch - 肯定應該是'getClientArea()。height'。我更新了代碼,謝謝!由getClientArea()返回的'Rectangle'是0x0,直到第一次調整大小。然後它將被正確地計算出來,如果你在'ControlListener'中輸出一個打印語句,你會看到它發生了變化。 – avojak