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

SWT TableViewer 反射實現通用 ITableLabelProvider:消除硬編碼列綁定

     編輯:Java 相關知識

痛點:傳統 LabelProvider 需硬編碼列邏輯


// 傳統寫法:每新增一個模型類都要修改 Provider
public String getColumnText(Object element, int columnIndex) {
    Person p = (Person) element;
    if (columnIndex == 0) return p.getId().toString();
    if (columnIndex == 1) return p.getName();
    if (columnIndex == 2) return p.getSex() ? "man" : "woman";
    if (columnIndex == 3) return p.getDate().toString();
    return "";
}

反射通用實現


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

public class ReflectiveTableLabelProvider implements ITableLabelProvider {
    @Override
    public Image getColumnImage(Object element, int columnIndex) {
        return null; // 如需圖標可擴展:約定 getIconXxx() 方法
    }

    @Override
    public String getColumnText(Object element, int columnIndex) {
        try {
            Class clazz = element.getClass();
            Field[] fields = clazz.getFields(); // 僅 public 欄位;若需 private 用 getDeclaredFields() + setAccessible(true)
            if (columnIndex >= 0 && columnIndex < fields.length) {
                Object value = fields[columnIndex].get(element);
                return value != null ? value.toString() : "";
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return "";
    }

    // 以下介面方法保持預設實現
    @Override public void addListener(ILabelProviderListener listener) {}
    @Override public void dispose() {}
    @Override public boolean isLabelProperty(Object element, String property) { return false; }
    @Override public void removeListener(ILabelProviderListener listener) {}
}

使用條件與限制

條件說明
模型類欄位順序 = 表格列順序Java 反射返回欄位順序不保證(JVM 實現相關),建議改用註解標記列索引或Getter 方法命名約定(如 getColumn0())
欄位需為 public或配合 setAccessible(true) 存取 private 欄位(需權限)
適用於單純資料顯示複雜格式化(日期、金額、條件顯示)仍需自定義 Provider

進化方向:註解驅動


@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface TableColumn {
    int index();      // 列索引
    String format();  // 格式化模式,如 "yyyy-MM-dd"
}

// 模型類
public class Person {
    @TableColumn(index = 0) public Long id;
    @TableColumn(index = 1) public String name;
    @TableColumn(index = 2, format = "sex") public boolean sex;
    @TableColumn(index = 3, format = "yyyy-MM-dd") public Date birthday;
}

Provider 掃描註解,按 index 排序,按 format 格式化,實現真正解耦、可維護的通用綁定。

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