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 }