Столбцы скрытых и шоу 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, но они имеют одинаковый размер.

Как я могу получить желаемый эффект?

Ответ 1

JTable # removeColumn удалить столбец только из представления JTable, больше в этом example

Ответ 2

Я думаю, что вы неправильно указали свои методы, когда хотите скрыть столбец, который вы установите

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

но в вашем коде вы делаете это, когда хотите показать столбец, который находится прямо напротив.

Также нет необходимости называть этот метод "setWidth" на TableColumn, читать TableColumn # setWidth (int).

Ответ 3

вместо того, чтобы повторно изобретать колесо, вы можете использовать JXTable (в проект SwingX), который поддерживает скрытые столбцы, комет с ui -control, чтобы пользователи могли скрывать/показывать их динамически - и множество других полезных вещей:).

Ответ 4

попробуйте сделать что-то вроде этого, например:

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

Это лучший способ, которым я знаю, чтобы скрыть столбец.

Ответ 5

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

Ответ 6

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