JTable hide and show columns

后端 未结 6 861
南旧
南旧 2021-01-11 13:03

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:

相关标签:
6条回答
  • 2021-01-11 13:14

    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.

    0 讨论(0)
  • 2021-01-11 13:19

    JTable#removeColumn remove Column only from JTable view, more in this example

    0 讨论(0)
  • 2021-01-11 13:24

    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).

    0 讨论(0)
  • 2021-01-11 13:32
        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);
                }
            }
    
    0 讨论(0)
  • 2021-01-11 13:34

    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 :).

    0 讨论(0)
  • 2021-01-11 13:34
    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);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题