package nl.helixsoft.gui.table; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.table.AbstractTableModel; /** * TableModel that is also a Map. */ // TODO: reusable class, move to nl.helixsoft.gui. // TODO: make sort order configurable // TODO: make rendering of key / value configurable // TODO: automatic adjusting // TODO: make table model editable // TODO: make it possible to pass an existing map (e.g. TreeMap). public class MapTableModel<K extends Comparable<K>, V> extends AbstractTableModel implements Map<K, V> { private final Map<K, V> delegate = new HashMap<K, V>(); @Override public int getColumnCount() { return 2; } @Override public int getRowCount() { return delegate.size(); } @Override public String getColumnName(int col) { if (col == 0) return "Key"; else return "Value"; } List<K> sortedKeys = Collections.emptyList(); private void refresh() { sortedKeys = new ArrayList<K>(delegate.keySet()); Collections.sort(sortedKeys); fireTableDataChanged(); } @Override public Object getValueAt(int row, int col) { switch (col) { case 0: return sortedKeys.get(row); case 1: return delegate.get(sortedKeys.get(row)); default: throw new IllegalArgumentException("Wrong column number: " + col); } } public K getRowKey(int row) { return sortedKeys.get(row); } @Override public void clear() { delegate.clear(); refresh(); } @Override public boolean containsKey(Object arg0) { return delegate.containsKey(arg0); } @Override public boolean containsValue(Object arg0) { return delegate.containsValue(arg0); } @Override public Set<Map.Entry<K, V>> entrySet() { return delegate.entrySet(); } @Override public V get(Object arg0) { return delegate.get(arg0); } @Override public boolean isEmpty() { return delegate.isEmpty(); } @Override public Set<K> keySet() { return delegate.keySet(); } @Override public V remove(Object arg0) { return delegate.remove(arg0); } @Override public int size() { return delegate.size(); } @Override public Collection<V> values() { return delegate.values(); } @Override public V put(K key, V value) { V result = delegate.put(key, value); refresh(); return result; } @Override public void putAll(Map<? extends K, ? extends V> m) { delegate.putAll(m); refresh(); } }