Java JTable - сделать редактируемым только один столбец - PullRequest
16 голосов
/ 17 ноября 2011

Мне было интересно, как сделать один столбец редактируемой JTable, остальные столбцы должны быть недоступны для редактирования.

Я перезаписал isCellEditable (), но это меняет каждую ячейку на недоступную для редактирования.Спасибо заранее.

Ответы [ 5 ]

31 голосов
/ 17 ноября 2011

вы можете установить, если isEditable для TableColumn или TableColumn and TableCell тоже

@Override
public boolean isCellEditable(int row, int col) {
     switch (col) {
         case 0:
         case 1:
             return true;
         default:
             return false;
      }
}
20 голосов
/ 17 ноября 2011

Переопределить табличную модель

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
}
11 голосов
/ 23 июля 2013

это установит редактируемое значение 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];
            }
};
6 голосов
/ 17 ноября 2011

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. То есть вы можете сделать редактируемую ячейку доступной только для чтения, но не наоборот

0 голосов
/ 12 декабря 2011

Чтение замечания Клеопатры (его второй раз он предложил посмотреть на javax.swing.JXTable , и теперь мне жаль, что я не посмотрел в первый раз :)) Япредлагаю вам перейти по ссылке

Я искал ответ, и я объединил несколько ответов для своего собственного решения: (однако, небезопасно для всех решений, но понятно и быстро реализуемо, хотя я рекомендую взглянуть на ссылкувыше)

Вы можете сделать его более гибким, чтобы указать, какой столбец будет редактироваться или нет, я использовал это для примера:

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

Примечание: конечно, вы должны определить глобальные таблицы columnsEditable и JTable в этом классе:

private JTable table;
private ArrayList<Integer> columnsEditable;

Примечание 2: по умолчанию все столбцы недоступны для редактирования, но этомое желаемое поведение.Если вы хотите другое, либо добавьте все столбцы в columnsEditable, либо полностью измените поведение (вместо него сделайте ArrayList columnsNonEditable).Что касается замечания Клеопатры: лучше не использовать это последнее предложение (но это зависит от используемой табличной модели и того, что вы делаете в остальной части вашей программы).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...