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

 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; } }

转载于:https://www.cnblogs.com/moonsnow/archive/2009/09/25/6226843.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值