您的位置:首页 > 移动开发 > Objective-C

一个便于用Swing中的Table展示对象List的类

2009-09-25 14:06 344 查看
 Swing开发中经常遇到这样的问题,需要将一个对象的列表直接用JTable显示出来,这时候我们往往要重写AbstractTableModel类,便于数据的展示,但是写起来还是会比较烦琐,所以对AbstractTableModel类进行了进一步的封装,使使用起来更加简单。

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

public abstract class MyAbstractTableModel extends AbstractTableModel {
private static final long serialVersionUID = 1L;

protected List<Object> datas = new ArrayList<Object>();
protected Class<?>[] columns;
protected String[] columnNames;

protected abstract Object getProperty(Object obj, int columnIndex);

@Override
public int getColumnCount() {
// TODO Auto-generated method stub
return columns.length;
}

@SuppressWarnings("unchecked")
public void setData(List datas) {
this.datas = datas;
}

public List<Object> list() {
return datas;
}

public Object getObject(int rowIndex) {
return datas.get(rowIndex);
}

@Override
public int getRowCount() {
// TODO Auto-generated method stub
return datas.size();
}

protected Class<?> getFieldType(Class<?> clz, String field) {
try {
Class<?> result = clz.getDeclaredField(field).getType();
if (result.equals(int.class)) {
result = Integer.class;
} else if (result.equals(boolean.class)) {
result = Boolean.class;
} else if (result.equals(byte.class)) {
result = Byte.class;
} else if (result.equals(char.class)) {
result = Character.class;
} else if (result.equals(long.class)) {
result = Long.class;
} else if (result.equals(float.class)) {
result = Float.class;
} else if (result.equals(double.class)) {
result = Double.class;
}
return result;
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return String.class;
}

@Override
public Class<?> getColumnClass(int columnIndex) {
// TODO Auto-generated method stub
if (columnIndex < 0 || columnIndex > columns.length)
return null;
return columns[columnIndex];
}

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// TODO Auto-generated method stub
return false;
}

@Override
public String getColumnName(int column) {
// TODO Auto-generated method stub
if (column < 0 || column > columns.length)
return null;
return columnNames[column];
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (rowIndex > getRowCount() || columnIndex > getColumnCount()
|| rowIndex < 0 || columnIndex < 0)
return null;
return getProperty(datas.get(rowIndex), columnIndex);
}

}


  这样以后再有这种需要的时候,只需实现MyAbstractTableModel类,并重写其中的getProperty方法即可,当然,为了方便期间,我们会再增加一个构造方法,可参考如下一个实现(其中WorkOrder类为一个POJO类)

public class WorkOrderTableModel extends DeltaTableModel {
private static final long serialVersionUID = 1L;

protected List<WorkOrder> datas = new ArrayList<WorkOrder>();

public WorkOrderTableModel(List<WorkOrder> datas, String[] columnNames) {
this.datas = (datas == null) ? new ArrayList<WorkOrder>() : datas;
this.columnNames = columnNames;
columns = new Class[] {
getFieldType(WorkOrder.class, "number"),
getFieldType(WorkOrder.class, "modelName"),
// getFieldType(WorkOrder.class, "createDate"),
getFieldType(WorkOrder.class, "targetQty"),
getFieldType(WorkOrder.class, "routeCode"),
getFieldType(WorkOrder.class, "owner") };
}

@Override
protected Object getProperty(Object obj, int index) {
WorkOrder workOrder = (WorkOrder) obj;
Object result = "";
switch (index) {
case 0:
result = workOrder.getNumber();
break;
case 1:
result = workOrder.getModelName();
break;
// case 2:
// result = workOrder.getCreateDate();
// break;
case 2:
result = workOrder.getTargetQty();
break;
case 3:
result = workOrder.getRouteCode();
break;
case 4:
result = workOrder.getOwner();
break;
}
return result;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐