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

使用反射實現 SWT TableViewer 的 ITableLabelProvider

     編輯:Java 程式設計入門

在 Eclipse SWT/JFace 開發中,TableViewer 需要 ITableLabelProvider 來提供每欄的文字與圖示。傳統寫法需針對每種資料類型撰寫 if-else 判斷欄位,缺乏彈性。本文展示如何利用 Java 反射機制,動態根據欄位索引讀取物件的公開欄位值,實現通用的 Label Provider。

import java.lang.reflect.Field;
import org.eclipse.jface.viewers.ILabelProviderListener;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.swt.graphics.Image;

/**
 * 通用 TableViewer Label Provider,利用反射動態獲取欄位值
 */
public class TableViewerLabelProvider implements ITableLabelProvider {

    public Image getColumnImage(Object element, int columnIndex) {
        return null; // 本例不提供圖示
    }

    public String getColumnText(Object element, int columnIndex) {
        Class clazz = element.getClass();
        Field[] fields = clazz.getFields(); // 僅取得 public fields
        try {
            return fields[columnIndex].get(element).toString();
        } catch (IllegalArgumentException | IllegalAccessException e) {
            e.printStackTrace();
        }
        return "";
    }

    // 以下為 IBaseLabelProvider 介面方法,本例不需邏輯
    public void addListener(ILabelProviderListener listener) {}
    public void dispose() {}
    public boolean isLabelProperty(Object element, String property) { return false; }
    public void removeListener(ILabelProviderListener listener) {}
}

使用方式:

// 原本寫法需針對每個屬性撰寫條件判斷
// if (columnIndex == 0) return p.getId().toString();
// if (columnIndex == 1) return p.getName();
// ...

// 現在只需確保資料物件的欄位順序與表格欄位一致,且欄位為 public
TableViewer viewer = new TableViewer(parent, SWT.FULL_SELECTION);
viewer.setLabelProvider(new TableViewerLabelProvider());
viewer.setContentProvider(ArrayContentProvider.getInstance());
viewer.setInput(dataList);

優點:

  • 單一 Provider 即可服務多種資料類型,無需修改程式碼。
  • 欄位順序對應表格欄位,直觀易維護。

注意:

  • 僅能存取 public 欄位;若需存取私有欄位,可改用 getDeclaredFields() 並設定 setAccessible(true)。
  • 效能上反射稍慢,但對一般表格資料量影響微乎其微。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved