JTable隐藏和显示列



我想添加一些列到表(Swing JTable)。其中一些将具有默认大小(例如250),其他将被隐藏(因此它们的大小将为0)。

 model = new DefaultTableModel();
 table = new JTable(model);
 setAutoResizeMode(AUTO_RESIZE_OFF);
 for (int i = 1; i < COLUMN_NAMES.length; i++) {
    model.addColumn(COLUMN_NAMES[i]);
    if (show[i]) show(index);
    else hide(index);
 }
 ........
 private void hide(int index) {
    TableColumn column = getColumnModel().getColumn(index);
    column.setMinWidth(0);
    column.setMaxWidth(0);
    column.setWidth(0);
    column.setPreferredWidth(0);
    doLayout();
}
private void show(int index) {
    final int width = 250;
    column.setMinWidth(15);
    column.setMaxWidth(width);
    column.setWidth(width);
    column.setPreferredWidth(width);
    doLayout();
}

问题是当表显示时,所有列都显示(没有隐藏),它们的大小不是250,但它们都有相同的大小。

我怎样才能得到想要的效果?

我认为你的方法命名不正确,当你想隐藏一个列时,你将设置

column.setMinWidth(0);
column.setMaxWidth(0);
column.setPreferredWidth(0);

但是在你的代码中,当你想要显示一个完全相反的列时,你会这样做。

也不需要在tablecoluml上调用这个"setWidth"方法,读取tablecolum# setWidth(int).

JTable#removeColumn仅从JTable视图中删除列,在本例中

与其重新发明轮子,不如考虑使用JXTable(在SwingX项目中),它支持隐藏列,并带有一个ui控件,允许用户动态地隐藏/显示它们——以及一堆其他有用的东西:)。

试试这样做,例如:

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);
    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);
            }
        }
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);
        }
    }
}

最新更新