[英]Java JTable - Make only one column editable
我想知道如何使 JTable 的一列可编辑,而其他列必须不可编辑。
我已经覆盖了 isCellEditable() 但这会将每个单元格更改为不可编辑。 提前谢谢。
您也可以为TableColumn
或TableColumn 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.