Я разработал один графический интерфейс, в котором я использовал один JTable, из которого я должен сделать 2 столбца невидимыми. Как мне это сделать?
Как сделать столбцы в JTable невидимыми для Swing Java
Ответы (8)
Удалите TableColumn
из TableColumnModel
.
TableColumnModel tcm = table.getColumnModel();
tcm.removeColumn( tcm.getColumn(...) );
Если вам нужен доступ к данным, используйте table.getModel().getValueAt(...)
.
Более сложное решение, которое позволяет пользователю скрывать/показывать столбцы по своему усмотрению, можно найти в Диспетчер столбцов таблицы.
view
и model
. Табличные методы всегда относятся к представлению. JTable API имеет множество convertXXX
методов, которые вы можете использовать. Таким образом, вы могли бы использовать convertColumnIndexToModel(...)
- person camickr; 16.10.2011
Сначала удалите столбец из представления
table.removeColumn(table.getColumnModel().getColumn(4));
Затем извлеките данные из модели.
table.getModel().getValueAt(table.getSelectedRow(),4);
Следует отметить, что при извлечении данных они должны извлекаться из модели, а не из таблицы.
Я попробовал 2 возможных решения, которые оба работают, но возникли проблемы с 1-м решением.
table.removeColumn(table.getColumnModel().getColumn(4));
or
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, попробуйте использовать табуляцию, когда вы нажимаете на скрытый столбец, фокус исчезает, пока вы снова не нажмете табуляцию. Это запутает пользователей». < /эм>
у меня была та же проблема, и из-за того, что я использую TableColumnModel
removColumn();
, мне это не помогает, поэтому я использовал это
table.getColumnModel().getColumn(0).setWidth(0);
table.getColumnModel().getColumn(0).setMinWidth(0);
table.getColumnModel().getColumn(0).setMaxWidth(0);
и у меня сработало нормально, он скрывает столбец 0, и я все еще могу получить от него значение
Установите минимальную, максимальную и «нормальную» ширину на 0:
jTable.getColumn("ABC").setMinWidth(0); // Must be set before maxWidth!!
jTable.getColumn("ABC").setMaxWidth(0);
jTable.getColumn("ABC").setWidth(0);
Примечание. Поскольку вы не можете установить maxWidth
‹ minWidth
, сначала необходимо изменить minWidth
(javadoc). То же самое верно и для width
.
Второй подход заключается в расширении TableColumnModel
и переопределении всех методов, чтобы создать иллюзию (для JTable), что в вашей модели нет этих двух столбцов.
Поэтому, когда вы скрываете столбец, вы должны вернуть на один меньше, когда таблица запрашивает количество столбцов, а когда она запрашивает столбец X, вам, возможно, придется добавить +1 к индексу столбца (в зависимости от того, находится ли он слева). или справа от скрытого столбца) и т. д.
Пусть ваша новая табличная модель перенаправляет все вызовы методов (с исправленными индексами и т. д.) в фактическую модель столбцов и использует новую табличную модель в JTable.
Если вы удалите столбец из 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
.