一個便於用Swing中的Table展示對象List的類

來源:互聯網
上載者:User

 Swing開發中經常遇到這樣的問題,需要將一個對象的列表直接用JTable顯示出來,這時候我們往往要重寫AbstractTableModel類,便於資料的展示,但是寫起來還是會比較煩瑣,所以對AbstractTableModel類進行了進一步的封裝,使使用起來更加簡單。

import java.util.ArrayList;<br />import java.util.List;</p><p>import javax.swing.table.AbstractTableModel;</p><p>public abstract class MyAbstractTableModel extends AbstractTableModel {<br />private static final long serialVersionUID = 1L;</p><p>protected List<Object> datas = new ArrayList<Object>();<br />protected Class<?>[] columns;<br />protected String[] columnNames;</p><p>protected abstract Object getProperty(Object obj, int columnIndex);</p><p>@Override<br />public int getColumnCount() {<br />// TODO Auto-generated method stub<br />return columns.length;<br />}</p><p>@SuppressWarnings("unchecked")<br />public void setData(List datas) {<br />this.datas = datas;<br />}</p><p>public List<Object> list() {<br />return datas;<br />}</p><p>public Object getObject(int rowIndex) {<br />return datas.get(rowIndex);<br />}</p><p>@Override<br />public int getRowCount() {<br />// TODO Auto-generated method stub<br />return datas.size();<br />}</p><p>protected Class<?> getFieldType(Class<?> clz, String field) {<br />try {<br />Class<?> result = clz.getDeclaredField(field).getType();<br />if (result.equals(int.class)) {<br />result = Integer.class;<br />} else if (result.equals(boolean.class)) {<br />result = Boolean.class;<br />} else if (result.equals(byte.class)) {<br />result = Byte.class;<br />} else if (result.equals(char.class)) {<br />result = Character.class;<br />} else if (result.equals(long.class)) {<br />result = Long.class;<br />} else if (result.equals(float.class)) {<br />result = Float.class;<br />} else if (result.equals(double.class)) {<br />result = Double.class;<br />}<br />return result;<br />} catch (SecurityException e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();<br />} catch (NoSuchFieldException e) {<br />// TODO Auto-generated catch block<br />e.printStackTrace();<br />}<br />return String.class;<br />}</p><p>@Override<br />public Class<?> getColumnClass(int columnIndex) {<br />// TODO Auto-generated method stub<br />if (columnIndex < 0 || columnIndex > columns.length)<br />return null;<br />return columns[columnIndex];<br />}</p><p>@Override<br />public boolean isCellEditable(int rowIndex, int columnIndex) {<br />// TODO Auto-generated method stub<br />return false;<br />}</p><p>@Override<br />public String getColumnName(int column) {<br />// TODO Auto-generated method stub<br />if (column < 0 || column > columns.length)<br />return null;<br />return columnNames[column];<br />}</p><p>@Override<br />public Object getValueAt(int rowIndex, int columnIndex) {<br />if (rowIndex > getRowCount() || columnIndex > getColumnCount()<br />|| rowIndex < 0 || columnIndex < 0)<br />return null;<br />return getProperty(datas.get(rowIndex), columnIndex);<br />}</p><p>}

  這樣以後再有這種需要的時候,只需實現MyAbstractTableModel類,並重寫其中的getProperty方法即可,當然,為了方便期間,我們會再增加一個構造方法,可參考如下一個實現(其中WorkOrder類為一個POJO類)

public class WorkOrderTableModel extends DeltaTableModel {<br />private static final long serialVersionUID = 1L;</p><p>protected List<WorkOrder> datas = new ArrayList<WorkOrder>();</p><p>public WorkOrderTableModel(List<WorkOrder> datas, String[] columnNames) {<br />this.datas = (datas == null) ? new ArrayList<WorkOrder>() : datas;<br />this.columnNames = columnNames;<br />columns = new Class[] {<br />getFieldType(WorkOrder.class, "number"),<br />getFieldType(WorkOrder.class, "modelName"),<br />// getFieldType(WorkOrder.class, "createDate"),<br />getFieldType(WorkOrder.class, "targetQty"),<br />getFieldType(WorkOrder.class, "routeCode"),<br />getFieldType(WorkOrder.class, "owner") };<br />}</p><p>@Override<br />protected Object getProperty(Object obj, int index) {<br />WorkOrder workOrder = (WorkOrder) obj;<br />Object result = "";<br />switch (index) {<br />case 0:<br />result = workOrder.getNumber();<br />break;<br />case 1:<br />result = workOrder.getModelName();<br />break;<br />// case 2:<br />// result = workOrder.getCreateDate();<br />// break;<br />case 2:<br />result = workOrder.getTargetQty();<br />break;<br />case 3:<br />result = workOrder.getRouteCode();<br />break;<br />case 4:<br />result = workOrder.getOwner();<br />break;<br />}<br />return result;<br />}<br />}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.