// 傳統寫法:每新增一個模型類都要修改 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 格式化,實現真正解耦、可維護的通用綁定。