首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

SWT CLabel 實現圖文垂直居中對齊的最簡方案

     編輯:Java 相關知識

問題背景

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 label = new Label(shell, SWT.CENTER);
label.setImage(image);
label.setText("文字");
label.setBounds(10, 10, 150, 150);  // 文字圖片靠頂對齊

Label 內部實現基於 GC.drawText 與 GC.drawImage 獨立計算坐標,無垂直對齊邏輯。

CLabel 內部原理(簡述)

CLabel 繼承自 Canvas,在 paintEvent 中統一計算文本與圖片的綁定矩形,根據 alignment 欄位在可用區域內居中繪製。SWT.SHADOW_NONE 禁用邊框陰影繪製邏輯,避免佈局偏移。

實戰擴展:配合 Layout 使用


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 設計中「隱藏在陰影樣式參數背後」的實用特性,屬於「知道即賺到」的工程技巧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved