import com.google.common.collect.HashBasedTable; import com.google.common.collect.Table; import com.google.common.collect.Tables; import javax.swing.event.TableModelListener; import javax.swing.table.AbstractTableModel; /** * * @author Mark George <mark.george@otago.ac.nz> */ public class PivotTableModel extends AbstractTableModel { private Table<Integer, Integer, Object> table = HashBasedTable.create(); private TableModelListener listener; @Override public int getRowCount() { return table.rowKeySet().size(); } @Override public int getColumnCount() { return table.columnKeySet().size(); } @Override public String getColumnName(int columnIndex) { return String.valueOf(columnIndex+1); } @Override public Class<?> getColumnClass(int columnIndex) { return Object.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } @Override public Object getValueAt(int rowIndex, int columnIndex) { return table.get(rowIndex, columnIndex); } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { table.put(rowIndex, columnIndex, aValue); fireTableCellUpdated(rowIndex, columnIndex); } public void addRow(String[] values) { int rowCount = getRowCount(); for (int i = 0; i < values.length; i++) { table.put(rowCount, i, values[i]); } fireTableRowsInserted(rowCount, rowCount); } public void transpose() { table = Tables.transpose(table); fireTableStructureChanged(); } @Override public String toString() { return table.toString(); } }