001 /* 002 * Copyright 2002-2004 the original author or authors. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 005 * use this file except in compliance with the License. You may obtain a copy of 006 * the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 013 * License for the specific language governing permissions and limitations under 014 * the License. 015 */ 016 package org.springframework.richclient.table.renderer; 017 018 import java.awt.Component; 019 import java.beans.BeanInfo; 020 import java.beans.IntrospectionException; 021 import java.beans.Introspector; 022 023 import javax.swing.JTable; 024 import javax.swing.table.DefaultTableCellRenderer; 025 import javax.swing.table.TableCellRenderer; 026 027 import org.apache.commons.logging.Log; 028 import org.apache.commons.logging.LogFactory; 029 import org.springframework.beans.BeanWrapper; 030 import org.springframework.beans.BeanWrapperImpl; 031 032 /** 033 * Renders a bean by using its default property. If no default property is defined the beans toString method will be 034 * used as the value. To render the default property the table default renderer for the property class will be used to 035 * get the cell component. 036 * 037 * @see JTable#getDefaultRenderer(Class) 038 * 039 * @author Keith Donald 040 * @author Mathias Broekelmann 041 */ 042 public class BeanTableCellRenderer extends DefaultTableCellRenderer { 043 private static final Log log = LogFactory.getLog(BeanTableCellRenderer.class); 044 045 private BeanWrapper beanWrapper; 046 047 public BeanTableCellRenderer() { 048 super(); 049 } 050 051 public BeanTableCellRenderer(BeanWrapper wrapper) { 052 beanWrapper = wrapper; 053 } 054 055 public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, 056 int row, int column) { 057 if (value != null) { 058 if (beanWrapper == null) { 059 beanWrapper = new BeanWrapperImpl(value); 060 } else { 061 beanWrapper.setWrappedInstance(value); 062 } 063 try { 064 BeanInfo info = Introspector.getBeanInfo(value.getClass()); 065 int index = info.getDefaultPropertyIndex(); 066 if (index != -1) { 067 String defaultPropName = beanWrapper.getPropertyDescriptors()[index].getName(); 068 Object val = beanWrapper.getPropertyValue(defaultPropName); 069 TableCellRenderer r = table.getDefaultRenderer(val.getClass()); 070 return r.getTableCellRendererComponent(table, val, isSelected, hasFocus, row, column); 071 } 072 } catch (IntrospectionException e) { 073 log.debug("Error during introspection of bean: " + e.getMessage(), e); 074 } 075 } 076 return super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 077 } 078 }