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 вместо). Что касается замечания Клеопатры: лучше не использовать это последнее предложение (но это зависит от используемой табличной модели и того, что вы делаете в остальной части вашей программы).