Как сделать столбцы в JTable Invisible для Swing Java
Я разработал один графический интерфейс, в котором я использовал один JTable, из которого я должен сделать 2 столбца невидимыми. Как мне это сделать?
7 ответов
Удалить TableColumn
от TableColumnModel
,
TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn( tcm.getColumn(...) );
Если вам нужен доступ к данным, то вы используете table.getModel().getValueAt(...)
,
Для более сложного решения, которое позволяет пользователю скрывать / показывать столбцы по своему желанию, обратитесь к диспетчеру столбцов таблиц.
Сначала удалите столбец из представления
table.removeColumn(table.getColumnModel().getColumn(4));
Затем получите данные из модели.
table.getModel().getValueAt(table.getSelectedRow(),4);
Следует отметить, что при извлечении данных их нужно извлекать из модели, а не из таблицы.
Я попробовал 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, который не отсортирован.
Так что я использовал 2-е решение, а затем использовал table.getValueAt(table.getSelectedRow(),4);
Единственная проблема, которую я вижу со вторым подходом, была упомянута @camickr: "Когда вы устанавливаете ширину в 0, попробуйте табулирование, когда вы нажимаете скрытый столбец, фокус исчезает, пока вы снова не нажмете вкладку. Это будет сбивать с толку пользователей".
Установите минимальную, максимальную и "нормальную" ширину равными 0:
jTable.getColumn("ABC").setWidth(0);
jTable.getColumn("ABC").setMinWidth(0);
jTable.getColumn("ABC").setMaxWidth(0);
Второй подход заключается в расширении TableColumnModel
и переопределите все методы, чтобы создать иллюзию (для JTable), что ваша модель не имеет этих двух столбцов.
Поэтому, когда вы скрываете столбец, вы должны возвращать на единицу меньше, когда таблица запрашивает количество столбцов, а когда запрашивает столбец X, возможно, вам придется добавить +1 к индексу столбца (в зависимости от того, находится ли он слева или справа от скрытой колонки) и т. д.
Пусть ваша новая модель таблицы перенаправит все вызовы методов (с исправленными индексами и т. Д.) В фактическую модель столбцов и использует новую модель таблиц в JTable.
У меня была такая же проблема и из-за того, что я использую TableColumnModel
removColumn();
не помогает мне, поэтому я использовал это
table.getColumnModel().getColumn(0).setWidth(0);
table.getColumnModel().getColumn(0).setMinWidth(0);
table.getColumnModel().getColumn(0).setMaxWidth(0);
и работал нормально для меня это скрыть столбец 0, и я все еще могу получить значение из него
Если вы удалите столбец из 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);
Я перепробовал их все: они не помогают. Лучший способ - создать новую модель таблицы без столбца, который вы хотите удалить. Вот как вы это делаете:
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);
Вы можете создать подкласс модели и переопределить TableModel.getColumnCount
следующее:
int getColumnCount() {
return super.getColumnCount()-2;
}
Последние два столбца не будут отображаться в JTable
,