Mega Code Archive

 
Categories / Java Tutorial / Swing
 

Bean Property Table Model

/*  * Copyright (C) 2001-2003 Colin Bell  * colbell@users.sourceforge.net  *  * This library is free software; you can redistribute it and/or  * modify it under the terms of the GNU Lesser General Public  * License as published by the Free Software Foundation; either  * version 2.1 of the License, or (at your option) any later version.  *  * This library is distributed in the hope that it will be useful,  * but WITHOUT ANY WARRANTY; without even the implied warranty of  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU  * Lesser General Public License for more details.  *  * You should have received a copy of the GNU Lesser General Public  * License along with this library; if not, write to the Free Software  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  */ import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Collections; import java.util.Comparator; import java.util.Vector; import javax.swing.table.DefaultTableModel; public class BeanPropertyTableModel extends DefaultTableModel {     private static final long serialVersionUID = 1L;   private Object _bean;   private String _nameColumnName = "Namecolumn";   private String _valueColumnName = "Valuecolumn";   public BeanPropertyTableModel()   {     super();   }   public void setBean(Object bean) throws RuntimeException   {     _bean = bean;     refresh();   }   public void refresh() throws RuntimeException   {     final Vector<Object> columnNames = new Vector<Object>();     columnNames.add(_nameColumnName);     columnNames.add(_valueColumnName);     final Vector<Object> columnData = new Vector<Object>();     if (_bean != null)     {       try       {         BeanInfo info = Introspector.getBeanInfo(_bean.getClass(), Introspector.USE_ALL_BEANINFO);         processBeanInfo(info, columnData);       }       catch (Exception ex)       {         throw new RuntimeException(ex);       }     }     // Sort the rows by the property name.     Collections.sort(columnData, new DataSorter());     setDataVector(columnData, columnNames);   }   private void processBeanInfo(BeanInfo info, Vector<Object> columnData)     throws InvocationTargetException, IllegalAccessException   {     BeanInfo[] extra = info.getAdditionalBeanInfo();     if (extra != null)     {       for (int i = 0; i < extra.length; ++i)       {         processBeanInfo(extra[i], columnData);       }     }     PropertyDescriptor[] propDesc = info.getPropertyDescriptors();     for (int i = 0; i < propDesc.length; ++i)     {       final String propName = propDesc[i].getName();       final Method getter = propDesc[i].getReadMethod();       if (propName != null && getter != null)       {         Vector<Object> line = generateLine(propName, _bean, getter);         if (line != null)         {           columnData.add(line);         }       }     }   }   /**    * Generate a line for the passed property.    *    * @param propName  Name of the property.    * @param bean    Bean containg the property.    * @param getter    The "getter" function to retrieve the    *            properties value.    *    * @return  A <CODE>Vector</CODE> containing the cells for the line in    *      the table. Element zero the first cell etc. Return    *      <CODE>null</CODE> if this property is <B>not</B> to be added    *      to the table.    */   protected Vector<Object> generateLine(String propName, Object bean, Method getter)     throws InvocationTargetException, IllegalAccessException   {     final Vector<Object> line = new Vector<Object>();     line.add(propName);     line.add(executeGetter(bean, getter));     return line;   }   protected Object executeGetter(Object bean, Method getter)     throws InvocationTargetException, IllegalAccessException   {     return getter.invoke(bean, (Object[])null);   }   public void setNameColumnName(String value)   {     _nameColumnName = value;   }   public void setValueColumnName(String value)   {     _valueColumnName = value;   }   /**    * This comparator is compatible with the strange use of lists in this     * class.  This classes lists are Vectors with Strings as the first element    * and any object as the other objects.    */   private static final class DataSorter implements Comparator<Object>   {     public int compare(Object o1, Object o2)     {         Vector<Object> v1 = (Vector<Object>)o1;         Vector<Object> v2 = (Vector<Object>)o2;         String lhs = (String)v1.get(0);         String rhs = (String)v2.get(0);       return lhs.compareToIgnoreCase(rhs);     }   } }