Подтвердить что ты не робот

Как сделать столбцы в JTable Invisible для Swing Java

Я разработал один графический интерфейс, в котором я использовал один JTable, из которого мне нужно сделать 2 столбца невидимыми. Как мне это сделать?

4b9b3361

Ответ 1

Удалите TableColumn из TableColumnModel.

TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn( tcm.getColumn(...) );

Если вам нужен доступ к данным, вы используете table.getModel().getValueAt(...).

Для более сложного решения, которое позволяет пользователю скрывать/показывать столбцы, если они хотят проверить Table Column Manager.

Ответ 2

Сначала удалите столбец из представления

 table.removeColumn(table.getColumnModel().getColumn(4));

Затем извлеките данные из модели.

table.getModel().getValueAt(table.getSelectedRow(),4);

Следует отметить, что при извлечении данных он должен извлекаться из модели не из таблицы.

Ответ 3

Я попробовал 2 возможных решения, которые работают, но получили некоторые проблемы с 1-м решением.

   table.removeColumn(table.getColumnModel().getColumn(4));

или

   table.getColumnModel().getColumn(4).setMinWidth(0);
   table.getColumnModel().getColumn(4).setMaxWidth(0);
   table.getColumnModel().getColumn(4).setWidth(0);

В моем последнем случае я предпочел второе решение, потому что добавил TableRowSorter.

   TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
   table.setRowSorter(sorter);

При использовании table.removeColumn(table.getColumnModel().getColumn(4)) он физически удалит столбец из представления/таблицы, чтобы вы не могли использовать table.getValueAt(row, 4) - он возвращает ArrayIndexOutOfBounds. Единственный способ получить значение удаленного столбца - вызвать table.getModel().getValueAt(table.getSelectedRow(),4). Поскольку TableRowSorter сортирует только то, что находится в таблице, но не данные в объекте DefaultTableModel, проблема заключается в том, что вы получаете значение после сортировки записей - он будет извлекать данные из DefaultModelObject, которые не сортируются.

Итак, я использовал второе решение, затем использовал table.getValueAt(table.getSelectedRow(),4);

Единственная проблема, которую я вижу со вторым подходом, упоминалась @camickr: "Когда вы устанавливаете ширину в 0, попробуйте использовать tabbing, когда вы нажмете на скрытый столбец, фокус исчезнет до тех пор, пока вы снова не нажмете кнопку" Это будет путать пользователей ".

Ответ 4

У меня была та же проблема, и из-за того, что я использую TableColumnModel removColumn();, не помогает мне, поэтому я использовал этот

table.getColumnModel().getColumn(0).setWidth(0);
table.getColumnModel().getColumn(0).setMinWidth(0);
table.getColumnModel().getColumn(0).setMaxWidth(0); 

и работал отлично для меня, он скрывает столбец 0, и я все еще могу получить от него значение

Ответ 5

Если вы удалите столбец из JTable столбец все еще присутствует в TableModel.

Например, чтобы удалить первый столбец идентификатора:

TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn(tcm.getColumn(0));

Если вы хотите получить доступ к значению удаляемого столбца, вы должны получить к нему доступ через getValueAt функции TableModel, а не JTable. Но вы должны конвертировать в rowIndex обратно в rowIndex в модели.

Например, если вы хотите получить доступ к первому столбцу выбранной строки:

int modelRow = table.convertRowIndexToModel(table.getSelectedRow());
int value = (Integer)table.getModel().getValueAt(modelRow,0);

Ответ 6

Установите минимальную, максимальную и "нормальную" ширину равными 0:

jTable.getColumn("ABC").setMinWidth(0); // Must be set before maxWidth!!
jTable.getColumn("ABC").setMaxWidth(0);
jTable.getColumn("ABC").setWidth(0);

Примечание: Поскольку вы не можете установить maxWidth < minWidth, вам нужно minWidth изменить minWidth (javadoc). То же самое верно для width.

Второй подход заключается в расширении TableColumnModel и переопределении всех методов для создания иллюзии (для JTable), что ваша модель не имеет этих двух столбцов.

Поэтому, когда вы скрываете столбец, вы должны возвращать на единицу меньше, когда таблица запрашивает количество столбцов, а когда запрашивает столбец X, возможно, вам придется добавить +1 в индекс столбца (в зависимости от того, является ли он слева или справа от скрытой колонки) и т.д.

Пусть ваша новая модель таблицы перенаправит все вызовы методов (с исправленными индексами и т.д.) В фактическую модель столбцов и будет использовать новую модель таблиц в JTable.

Ответ 7

Вы можете создать подкласс модели и переопределить TableModel.getColumnCount следующим образом:

int getColumnCount() {
    return super.getColumnCount()-2;
}

Последние два столбца не будут отображаться в JTable.

Ответ 8

Я попробовал их все: они не помогают. ЛУЧШИЙ путь - создать новую модель таблицы без столбца, который вы хотите удалить. Вот как вы это делаете:

table = (DefaultTableModel) <table name>.getModel();
DefaultTableModel table1 = new DefaultTableModel();
Vector v = table.getDataVector();
Vector v1 = newvector(v,<column index you want to delete>);

Vector newvector(Vector v,int j){
    Vector v1= new Vector();
    try{
        Vector v2;
        Object[] o = v.toArray();
        int i =0;
        while(i<o.length){
            v2 = (Vector) o[i];
            v2.remove(j);
            v1.add(v2);
            i++;
        }
    }
    catch(Exception e){
        JOptionPane.showMessageDialog(null,"Error in newvector \n"+e);
    }
    return v1;
}

Vector getColumnIdentifiers(int i) {
    Vector columnIdentifiers = new Vector();
    int j=0;
    while(j<i){
        columnIdentifiers.add(("c"+(j+1)));
        j++;
    }
    return columnIdentifiers;
}
table1.setDataVector(v1,getColumnIdentifiers((<column count>-1)));
<table name>.setModel(table1);