001    // Copyright 2006 by Basil Vandegriend.  All rights reserved.
002    
003    package com.basilv.examples.enums;
004    
005    import java.util.*;
006    
007    import javax.swing.table.AbstractTableModel;
008    
009    public class PersonTableModel extends AbstractTableModel
010    {
011    
012      /**
013       * Represents a column of the table.
014       */
015      static enum Column {
016        FIRST_NAME("First Name") {
017          @Override public Object getValue(Person person) {
018            return person.getFirstName();
019          }
020    
021          @Override public int getWidthInCharacters() {
022            return 10;
023          }
024        },
025    
026        LAST_NAME("Last Name") {
027          @Override public Object getValue(Person person) {
028            return person.getLastName();
029          }
030    
031          @Override public int getWidthInCharacters() {
032            return 20;
033          }
034        },
035    
036        AGE("Age") {
037          @Override public Object getValue(Person person) {
038            return person.getAge();
039          }
040    
041          @SuppressWarnings("unchecked") @Override public Class getColumnClass() {
042            return Integer.class;
043          }
044    
045          @Override public int getWidthInCharacters() {
046            return 5;
047          }
048        },
049    
050        BIRTHDAY("Birthday") {
051          @Override public Object getValue(Person person) {
052            return person.getBirthDay();
053          }
054    
055          @SuppressWarnings("unchecked") @Override public Class getColumnClass() {
056            return Date.class;
057          }
058    
059          @Override public int getWidthInCharacters() {
060            return 12;
061          }
062        };
063    
064        
065        private String displayName;
066    
067        private Column(String displayName) {
068          assert displayName != null
069            && displayName.length() > 0;
070          this.displayName = displayName;
071        }
072    
073        public String getDisplayName() {
074          return displayName;
075        }
076    
077        /**
078         * Return the value for this column for the specified
079         * person.
080         */
081        public abstract Object getValue(Person person);
082    
083        /**
084         * Return the class of Object returned by this column.
085         */
086        @SuppressWarnings("unchecked") public Class getColumnClass() {
087          return String.class; // Default value
088        }
089    
090        /**
091         * Return the number of characters needed to display the
092         * header and data for this column.
093         */
094        public abstract int getWidthInCharacters();
095      }
096    
097      private List<Person> personList = new ArrayList<Person>();
098    
099      public void setPersonList(List<Person> list) {
100        assert list != null;
101        personList.clear();
102        personList.addAll(list);
103        fireTableDataChanged();
104      }
105    
106      public int getColumnCount() {
107        return Column.values().length;
108      }
109    
110      public int getRowCount() {
111        return personList.size();
112      }
113    
114      public Object getValueAt(int rowIndex, int columnIndex) {
115        Person person = getPerson(rowIndex);
116        Column column = getColumn(columnIndex);
117        return column.getValue(person);
118      }
119    
120      @Override public String getColumnName(int columnIndex) {
121        return getColumn(columnIndex).getDisplayName();
122      }
123    
124      @Override public Class<?> getColumnClass(int columnIndex) {
125        Column column = getColumn(columnIndex);
126        return column.getColumnClass();
127      }
128    
129      Person getPerson(int rowIndex) {
130        return personList.get(rowIndex);
131      }
132    
133      private Column getColumn(int columnIndex) {
134        return Column.values()[columnIndex];
135      }
136    
137    }