SWT 標準 Label 控件僅支持水平對齊(SWT.LEFT/CENTER/RIGHT),不支持垂直居中。開發者常通過 Canvas 繪製或 GridLayout 組合實現,代碼冗長。本文揭示一個鮮為人知的技巧:CLabel + SWT.SHADOW_NONE 原生支持圖文垂直居中。
package com.laozizhu.search.client.test;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class LabelVerticalCenter {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setText("CLabel 垂直居中演示");
// 載入圖片(需確保路徑正確)
Image image = new Image(display, "laozizhu.png");
// 關鍵:CLabel + SHADOW_NONE + setAlignment(SWT.CENTER)
CLabel label = new CLabel(shell, SWT.SHADOW_NONE);
label.setImage(image);
label.setText("老紫竹的家");
label.setAlignment(SWT.CENTER); // 同時生效水平+垂直居中
label.setBackground(display.getSystemColor(SWT.COLOR_YELLOW)); // 背景色驗證居中區域
label.setBounds(10, 10, 150, 150); // 固定大小區域
shell.setSize(200, 250);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}
| 設置 | 作用 | 注意事項 |
|---|---|---|
new CLabel(shell, SWT.SHADOW_NONE) | 創建無陰影標簽,啟用增強對齊 | 必須指定 SHADOW_NONE,否則默認陰影樣式干擾對齊 |
setAlignment(SWT.CENTER) | 同時設置水平居中 + 垂直居中 | 標準 Label 僅水平生效 |
setBounds(x, y, w, h) | 定義對齊參考區域 | 若使用 Layout 需配合 LayoutData 指定高度 |
// 標準 Label - 垂直居中無效
Label label = new Label(shell, SWT.CENTER);
label.setImage(image);
label.setText("文字");
label.setBounds(10, 10, 150, 150); // 文字圖片靠頂對齊
Label 內部實現基於 GC.drawText 與 GC.drawImage 獨立計算坐標,無垂直對齊邏輯。
CLabel 繼承自 Canvas,在 paintEvent 中統一計算文本與圖片的綁定矩形,根據 alignment 欄位在可用區域內居中繪製。SWT.SHADOW_NONE 禁用邊框陰影繪製邏輯,避免佈局偏移。
Composite parent = new Composite(shell, SWT.NONE);
parent.setLayout(new GridLayout());
CLabel label = new CLabel(parent, SWT.SHADOW_NONE);
label.setImage(image);
label.setText("標題");
label.setAlignment(SWT.CENTER);
GridData gd = new GridData(SWT.CENTER, SWT.CENTER, false, false);
gd.widthHint = 150;
gd.heightHint = 150;
label.setLayoutData(gd);
關鍵:GridData 指定 heightHint 給定高度參考,SWT.CENTER 垂直對齊才生效。
CLabel 不支持文本換行(\n 會顯示為方框),多行文本請用 Text (READ_ONLY) 或自繪一行 new CLabel(parent, SWT.SHADOW_NONE) 替換 new Label(parent, SWT.CENTER),即可獲得原生垂直居中能力。這是 SWT API 設計中「隱藏在陰影樣式參數背後」的實用特性,屬於「知道即賺到」的工程技巧。