001// Copyright 2006 by Basil Vandegriend. All rights reserved. 002 003package com.basilv.examples.enums; 004 005import java.util.*; 006 007import javax.swing.table.AbstractTableModel; 008 009public 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}