我想知道如何使JTable的一列可编辑,其他列必须是不可编辑的。
我已覆盖isCellEditable()但这会将每个单元格更改为不可编辑。 Thnx提前。
答案 0 :(得分:31)
您可以为isEditable
或TableColumn
设置TableColumn and TableCell
@Override
public boolean isCellEditable(int row, int col) {
switch (col) {
case 0:
case 1:
return true;
default:
return false;
}
}
答案 1 :(得分:20)
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以及你在程序的其余部分中做了什么)。