繁体   English   中英

Java JTable - 只能编辑一列

[英]Java JTable - Make only one column editable

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

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

您也可以为TableColumnTableColumn and TableCell设置是否isEditable

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

覆盖表模型

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 列和第 8 列设置可编辑为 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];
            }
};

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

您还可以创建一个扩展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);
    }

阅读 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 表全局:

private JTable table;
private ArrayList<Integer> columnsEditable;

注 2:默认情况下,所有列都不可编辑,但这是我想要的行为。 如果您不希望如此,请将所有列添加到 columnsEditable 或完全更改行为(改为使用 ArrayList columnsNonEditable)。 关于 Kleopatra 的评论:最好不要使用最后一个建议(但这取决于使用的表模型以及您在程序的其余部分所做的工作)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM