I want to add some columns to a table (Swing JTable). Some of them will have a default size (e.g. 250), others will be hidden (so their size will be 0). I use this code:
try this something like this for example:
myTableModel = new DefaultTableModel();
myTableModel.setColumnIdentifiers(new Object[]{"ID", "Name"});
JTable myTable = new JTable(myTableModel);
// remember to save the references
TableColumn myTableColumn0 = guiLoteryNumbersTable.getColumnModel().getColumn(0);
TableColumn myTableColumn1 = guiLoteryNumbersTable.getColumnModel().getColumn(1);
//...
// remove temporary the column ("hide")
myTable.getColumnModel().removeColumn(myTableColumn1);
// then you restore that column when you need it ("show")
myTable.getColumnModel().addColumn(myTableColumn1);
That's the best way I know to hide a column.
JTable#removeColumn remove Column only from JTable view, more in this example
I think you have named your methods incorrectly, when you want to hide a column you will set
column.setMinWidth(0);
column.setMaxWidth(0);
column.setPreferredWidth(0);
but in your code you are doing this when you want to show a column which is exactly opposite.
Also there is no need to call this "setWidth" method on a TableColumn, read TableColumn#setWidth(int).
HashMap<String,TableColumn> hashMap_columns = new HashMap<String,TableColumn>();
DefaultTableColumnModel defaultTableColumnModel = (DefaultTableColumnModel)jtable.getColumnModel();
Enumeration<TableColumn> enumeration = defaultTableColumnModel.getColumns();
while (enumeration.hasMoreElements())
{
TableColumn tableColumn = enumeration.nextElement();
hashMap_columns.put((String)tableColumn.getIdentifier(),tableColumn);
}
public void setColumnVisible(String identifier, boolean setVisible)
{
TableColumn tableColumn = hashMap_columns.get(identifier);
if (setVisible)
{
// using a sorted map removes the need to check column index/position
SortedMap<Integer,TableColumn> sortedMap = new TreeMap<Integer,TableColumn>();
// retreive all visible columns
Enumeration<TableColumn> enumeration = defaultTableColumnModel.getColumns();
while (enumeration.hasMoreElements())
{
TableColumn column = enumeration.nextElement();
sortedMap.put(column.getModelIndex(),column);
}
// add the column of interest to the sorted map
sortedMap.put(tableColumn.getModelIndex(),tableColumn);
// remove all visible columns
for (TableColumn column: sortedMap.values())
{
defaultTableColumnModel.removeColumn(column);
}
// add all previously visible columns as well as the column of interest
for (TableColumn column: sortedMap.values())
{
defaultTableColumnModel.addColumn(column);
}
}
else
{
defaultTableColumnModel.removeColumn(tableColumn);
}
}
instead of re-inventing the wheel you might consider to use JXTable (in the SwingX project) which supports hidden columns, comlete with a ui-control to allow users hiding/showing them dynamically - and a bunch of other useful thingies :).
public class TableColumnHider {
private final JTable table;
private final TableColumnModel tcm;
private final Map hiddenColumns;
public TableColumnHider(JTable table) {
this.table = table;
tcm = table.getColumnModel();
hiddenColumns = new HashMap();
}
public void hide(String columnName, String keySig) {
int index = tcm.getColumnIndex(columnName);
TableColumn column = tcm.getColumn(index);
hiddenColumns.put(columnName, column);
hiddenColumns.put(keySig + columnName, new Integer(index));
tcm.removeColumn(column);
}
public void show(String columnName, String keySig) {
Object o = hiddenColumns.remove(columnName);
if (o == null) {
return;
}
tcm.addColumn((TableColumn) o);
o = hiddenColumns.remove(keySig + columnName);
if (o == null) {
return;
}
int column = ((Integer) o).intValue();
int lastColumn = tcm.getColumnCount() - 1;
if (column < lastColumn) {
tcm.moveColumn(lastColumn, column);
}
}
}