Java JTable - 使只有一列可编辑

18

我想知道如何使 JTable 中的一列可编辑,而其他列则不可编辑。

我已经重写了 isCellEditable() 方法,但这会将每个单元格都设置为不可编辑。提前感谢您的回答。

6个回答

34

你可以为TableColumn或者TableColumn和TableCell设置isEditable属性。

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

12
错误 - a) 没有任何 isEditable 方法 b) TableColumn 根本没有可编辑性的概念 c) TableCell 不存在。正确的做法是在 TableModel 实现或 JTable 上使用 isCellEditable -1 分钟的粗心。 - kleopatra

21

覆盖 表模型

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
}

应该是 columnIndex == 0 而不是 rowIndex == 0 - Eng.Fouad

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

谢谢@arash,好的代码片段。我稍微修改了一下,使用以下代码禁用了特定单元格... '@Override public boolean isCellEditable(int rowIndex, int columnIndex) { if (rowIndex == 0 && columnIndex == 1){ return false;} return canEdit[columnIndex]; }' ...这可能有助于禁用特定单元格。 - Java.beginner

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返回的编辑性相比,仅可能缩小可编辑范围。也就是说,您可以将可编辑单元格变为只读单元格,但反过来则不行。

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

-1

阅读Kleopatra的评论(他第二次建议看一下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 table全局变量。
private JTable table;
private ArrayList<Integer> columnsEditable;

注意2:默认情况下,所有列都是不可编辑的,但这是我期望的行为。如果你希望不同,请将所有列添加到columnsEditable中,或者完全改变行为(使用ArrayList columnsNonEditable代替)。 关于Kleopatra的评论:最好不要使用最后的建议(但这取决于所使用的tablemodel和程序的其他部分)。

不是一个安全的解决方案:视图必须尊重模型的设置,因此您在视图层实现的任何内容都只能缩小模型的可编辑性,而不能扩大它。因此,在代码的某个地方,您必须首先查询模型,仅当返回true时,才能保留或更改该决策。 - kleopatra
好的,感谢反馈,但我认为这可以很容易地实现。更多地说,我想要比硬编码可编辑列更灵活的方法。但是思考这个问题是一件好事,改变列会改变这个问题,然而通常我设置:table.getTableHeader().setReorderingAllowed(false)(例如)。 - michel.iamit
@kleopatra:思考一下,你的评论也取决于你使用什么作为表格模型。默认的表格模型始终是可编辑的,因此设置可编辑性只会缩小它,而不会扩大它。此外,我的解决方案只是扩展了其他给定解决方案的可能性。 - michel.iamit
请注意,您不能对模型做任何假设...即使是DefaultTableModel也可能被扩展以不允许编辑;-) 查看JXTable / TableColumnExt的源代码,以了解如何实现安全(缩小范围)逻辑。 - kleopatra
好的,你说服了我,建议的解决方案对于我的简单情况有效。然而,看到JXTable,这给了我更多的可能性! - michel.iamit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接