Java JTable - Сделать только один отредактированный столбец
Мне было интересно, как сделать один столбец JTable редактируемым, другие столбцы должны быть недоступны для редактирования.
Я перезаписал isCellEditable(), но это изменяет каждую ячейку на не редактируемый.
Thnx заранее.
Ответы
Ответ 1
вы можете установить if is isEditable
для TableColumn
или TableColumn and TableCell
тоже
@Override
public boolean isCellEditable(int row, int col) {
switch (col) {
case 0:
case 1:
return true;
default:
return false;
}
}
Ответ 2
Переопределите модель таблицы
isCellEditable(int rowIndex, int columnIndex)
принимает два аргумента, просто верните true для нужного столбца?
public boolean isCellEditable(int rowIndex, int columnIndex){
return columnIndex == 0; //Or whatever column index you want to be editable
}
Ответ 3
это установило бы редактируемое значение true для столбцов 3 и 8 и false для других.
DefaultTableModel model = new DefaultTableModel() {
boolean[] canEdit = new boolean[]{
false, false, true, false, false,false,false, true
};
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit[columnIndex];
}
};
Ответ 4
JXTable/TableColumnExt проекта SwingX имеют api для настройки редактирования для каждой таблицы и столбца
// make the table completely read-only
xTable.setEditable(false);
// make a column read-only
xTable.getColumnExt(index).setEditable(false);
Обратите внимание, что можно сузить редактируемость по сравнению с возвращаемым model.isCellEditable. То есть вы можете сделать редактируемую ячейку только для чтения, но не наоборот.
Ответ 5
Считая замечание Клеопатры (его второй раз он предложил посмотреть javax.swing.JXTable, и теперь мне жаль, что я не посмотрел в первый раз:)) Я предлагаю вам перейти по ссылке
Я искал asnwer, и я объединил несколько ответов на свое собственное решение: (однако, небезопасно для всех решений, но понятно и быстро подтолкнуло, хотя я рекомендую посмотреть ссылку выше)
Вы можете сохранить его более гибким, чтобы установить, какой столбец доступен для редактирования или не позже, я использовал это для exmaple:
columnsEditable=new ArrayList<Integer>();
table=new JTable(new DefaultTableModel(){
@Override
public boolean isCellEditable(int row, int col) {
if(columnsEditable.isEmpty()){
return false;
}
if(columnsEditable.contains(new Integer(col))){
return true;
}
return false;
}
});
И я использовал эту функцию для установки редактируемого или нет:
public void setColumnEditable(int columnIndex,boolean editable){
if(editable){
if(!columnsEditable.contains(new Integer(columnIndex))){
columnsEditable.add(new Integer(columnIndex));
}
}else{
if(columnsEditable.contains(new Integer(columnIndex))){
columnsEditable.remove(new Integer(columnIndex));
}
}
}
Примечание. Конечно, вы должны определить columnEditable и JTable table global в этом классе:
private JTable table;
private ArrayList<Integer> columnsEditable;
Примечание 2: по умолчанию все столбцы не редактируются, но это мое желаемое поведение. Если вы хотите другой, либо добавьте все столбцы в столбцыEditable, либо полностью измените поведение (сделайте столбцы ArrayListNonEditable вместо).
Что касается замечания Клеопатры: лучше не использовать это последнее предложение (но это зависит от используемой табличной модели и того, что вы делаете в остальной части вашей программы).