如何使JTable不可编辑


Answers:


22

您可以使用TableModel

定义一个这样的类:

public class MyModel extends AbstractTableModel{
    //not necessary
}

实际上isCellEditable()false默认设置,因此您可以忽略它。(请参阅:http : //docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html

然后使用setModel()您的方法JTable

JTable myTable = new JTable();
myTable.setModel(new MyModel());

1
您无法使用public void方法返回布尔值。
地理

1
同样的方法是isCellEditable
Matt

虽然您指定的方法有效,但是AbstractTableModel中没有isEditable这样的方法。存在的方法isCellEditable(int,int)以rowIndex和coulmnIndex作为参数。用户可以通过覆盖“ isCellEditable”方法来选择性地启用/禁用特定行/列的编辑,或者可以使用默认实现来禁用所有单元格的编辑。
sateesh

150

您可以覆盖isCellEditable方法并根据需要实现,例如:

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

要么

//instance table model
DefaultTableModel tableModel = new DefaultTableModel() {

   @Override
   public boolean isCellEditable(int row, int column) {
       //Only the third column
       return column == 3;
   }
};

table.setModel(tableModel);

请注意您的JTable是否消失

如果您JTable在使用此控件时消失了,则很可能是因为您需要使用DefaultTableModel(Object[][] data, Object[] columnNames)构造函数。

//instance table model
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames) {

    @Override
    public boolean isCellEditable(int row, int column) {
       //all cells false
       return false;
    }
};

table.setModel(tableModel);

3
这也是使双击事件与JTable一起正常工作的解决方案。单元格通常会在进入编辑模式时消耗双击,这将阻止单元格执行操作,而是将双击发送到JTable本身。谢谢您的解决方案,尼尔森!
锚地2012年

2
@Jop然后代码中的其他地方出了点问题–表格永远不会因为表格的模型不可编辑而消失……
kleopatra 2014年

1
@DougHauf看来你不懂Java,或者说真的不懂任何一种语言,因为大多数语言对布尔操作使用相同的语法...确实返回了布尔值...我建议你去找一个非常基本的Java教程并从头开始。试图像这样跳入秋千,最终将导致您学习所有错误。
searchengine27 2015年

1
@DougHauf,==是Equals函数的别名,该函数比较对象(在左侧和右侧)并返回一个布尔值。我想您已经使用了if语句来评估布尔值,并且通常与这种表达式一起使用,例如if(a == b)做某事。尝试打印a == b或仅将其分配给变量并了解结果。
内尔森·埃尔多罗(NELSON ELDORO)

1
上面的修复程序对我也不起作用。这将导致表的列和数据元素消失。我的表是用table = new JTable(tempTable,columnNames);创建的,其中tempTable是String [] [],列名是String []。我相信问题是由新的DefaultTableModel()未指定表模型的数据和列名称引起的。如何在数据模型中指定那些。我尝试了table.setModel(tableModel(tempTable,columnNames));,但这会导致“找不到符号”错误。
user1164199


36

只需添加

table.setEnabled(false);

这对我来说可以。


1
如果您不使用自定义表格模型,那就太好了!
Kingsolmn 2012年

26
但是您将无法选择单元格或行。
tianz 2013年

3
在某些L&F中,这看起来是“灰色的”。
stommestack 2013年

2
这样可行。谢谢。但是,我仍然想知道为什么nelson的数据模型方法导致表的列和数据元素分解。
user1164199

1
对我来说效果很好!
Colby Cox

10

如果要根据一组值自动创建TableModel(使用“ new JTable(Vector,Vector)”),则从列中删除编辑器可能会更容易:

JTable table = new JTable(my_rows, my_header);

for (int c = 0; c < table.getColumnCount(); c++)
{
    Class<?> col_class = table.getColumnClass(c);
    table.setDefaultEditor(col_class, null);        // remove editor
}

没有编辑器,数据将不可编辑。


4
-1在不适当的位置进行随机黑客攻击绝不是一种选择
kleopatra 2014年

请,您能解释一下为什么这是“在不适当的位置进行随机黑客入侵”吗?根据setDefaultEditor()doc:“如果editor为null,则删除此列类的默认编辑器。”
Freesoft 2014年

是的,并返回到Object的默认值;-)因此,您并没有真正禁用编辑功能(如果其中一列属于Object类型,这是偶然的事情),而且您可能缺少任何可能具有自定义编辑器的列。有一种旨在实现控制单元格可编辑性的api,那就是模型的。其他所有东西都在被黑客入侵,因此是不合适的。
kleopatra 2014年

我明白你的意思。但是我从api上了解到的是,如果我以快速的方式(使用“ new JTable(Vector,Vector)”)创建表,则该表的所有列都将具有默认编辑器。因此,如果我运行“ table.setDefaultEditor(column,null)”,那么我将从列中删除默认编辑器,因此该列将没有任何编辑器,并且该列将不可编辑。那将会?
freesoft 2014年

我以这种方式创建了表格new JTable(Vector, Vector)并为我工作。我在任何地方都不需要编辑,所以你有我的投票权。
Dani Sancas 2014年


2

创建新的DefaultCellEditor类:

public static class Editor_name extends DefaultCellEditor {
  public Editor_name(JCheckBox checkBox) {
   super(checkBox);
  }
  @Override
  public boolean isCellEditable(EventObject anEvent) {
    return false;
  }
}

并使用setCellEditor:

JTable table = new JTable();
table.getColumn("columnName").setCellEditor(new Editor_name(new JCheckBox()));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.