Java JTable - 只能编辑一列

时间:2011-11-17 12:35:55

标签: java swing jtable

我想知道如何使JTable的一列可编辑,其他列必须是不可编辑的。

我已覆盖isCellEditable()但这会将每个单元格更改为不可编辑。 Thnx提前。

6 个答案:

答案 0 :(得分:31)

您可以为isEditableTableColumn设置TableColumn and TableCell

@Override
public boolean isCellEditable(int row, int col) {
     switch (col) {
         case 0:
         case 1:
             return true;
         default:
             return false;
      }
}

答案 1 :(得分:20)

覆盖table model

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
}

答案 2 :(得分:11)

这将为第3列和第8列设置editable为true,为其他列设置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];
            }
};

答案 3 :(得分:6)

SwingX项目的JXTable / TableColumnExt具有api来配置每个表和每列的可编辑性

 // make the table completely read-only
 xTable.setEditable(false);
 // make a column read-only
 xTable.getColumnExt(index).setEditable(false);

请注意,与model.isCellEditable返回的可编辑性相比,只能缩小可编辑性。也就是说,您可以将可编辑单元格设为只读,但不能反过来

答案 4 :(得分:0)

您还可以创建一个扩展 JTable 的类并添加一个布尔数组

public class MyTable extends JTable {
    private Boolean[] editable_columns;

    public DetailsTable(Object[][] rowData, Object[] columnNames) {
        super(rowData, columnNames);
        editable_columns = new Boolean[columnNames.length];
        for (int i = 0; i < columnNames.length; i++){
            editable_columns[i] = true;
        }
    }

创建自己的方法来修改一列的值

public void setColumnEditable(int index, boolean isEditable){
        if (index > -1 && index < editable_columns.length){
            editable_columns[index] = isEditable;
        }
    }

在用你的布尔数组覆盖 setValueAt 之后

@Override
    public void setValueAt(Object aValue, int row, int column) {
        if (editable_columns[column])
            super.setValueAt(aValue, row, column);
    }

答案 5 :(得分:-1)

阅读Kleopatra的评论(他第二次建议看看javax.swing.JXTable,现在我很抱歉我第一次看不到:))我建议你按照链接< / p>

我搜索了一个asnwer,并将几个答案合并到我自己的解决方案中:(但是,对于所有解决方案都不安全,但是可以理解并且快速实施,尽管我建议查看上面的链接)

您可以更灵活地设置哪个列可以编辑或不在以后编辑,我将其用于例如:

    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表global:

private JTable table;
private ArrayList<Integer> columnsEditable;

注意2:默认情况下,所有列都不可编辑,但这是我想要的行为。如果你要求其他人,请将所有列添加到columnsEditable或完全更改行为(使ArrayList columnsNonEditable代替)。 关于Kleopatra的评论:最好不要使用这个最后的建议(但这取决于所使用的tablemodel以及你在程序的其余部分中做了什么)。