如何使 JTable 不可编辑
Posted
技术标签:
【中文标题】如何使 JTable 不可编辑【英文标题】:How to make a JTable non-editable 【发布时间】:2010-12-31 17:46:15 【问题描述】:如何使JTable
不可编辑?我不希望我的用户能够通过双击单元格中的值来编辑它们。
【问题讨论】:
这里有更好的答案:***.com/questions/9919230/disable-user-edit-in-jtable 【参考方案1】:您可以使用TableModel
。
这样定义一个类:
public class MyModel extends AbstractTableModel
//not necessary
实际上isCellEditable()
默认是false
所以你可以省略它。 (见:http://docs.oracle.com/javase/6/docs/api/javax/swing/table/AbstractTableModel.html)
然后使用JTable
的setModel()
方法。
JTable myTable = new JTable();
myTable.setModel(new MyModel());
【讨论】:
你不能让public void
方法返回布尔值。
方法也是isCellEditable
虽然您指定的方法有效,但 AbstractTableModel 中没有 isEditable 这样的方法。存在的是方法 isCellEditable(int,int) ,它以 rowIndex 和 coumnIndex 作为参数。用户可以通过覆盖“isCellEditable”方法选择性地启用/禁用对特定行/列的编辑,也可以使用默认实现来禁用对所有单元格的编辑。【参考方案2】:
我用过,效果很好:非常简单,效果很好。
JTable myTable = new JTable();
myTable.setEnabled(false);
【讨论】:
无法选择。 简单好用的解决方案 问题是关于可编辑未启用。启用并没有解决目的【参考方案3】:您可以覆盖方法 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);
【讨论】:
这也是使双击事件与 JTable 一起正常工作的解决方案。单元格进入编辑模式时通常会使用双击,这将阻止单元格这样做,而是将双击发送到 JTable 本身。感谢您的解决方案,尼尔森! @Jop 然后代码中的其他地方出了点问题 - 表 永远 消失只是因为表的模型不可编辑... @DougHauf 看来您不了解 Java,或者实际上任何语言都不太了解,因为大多数语言都使用相同的布尔运算语法...确实返回布尔值...我会建议你去找一个非常基础的 Java 教程,从头开始。试图像这样跳入秋千最终会让你学错一切。 @DougHauf,== 是比较对象(左侧和右侧)并返回布尔值的 Equals 函数的别名。我想你已经使用了 if 语句来计算布尔值,并且通常与这种表达式一起使用,例如 if(a == b) 做某事。尝试打印 a==b 或将其分配给变量并理解结果。 上述修复对我也不起作用。它会导致表的列和数据元素消失。我的表是使用 table = new JTable(tempTable, columnNames); 创建的,其中 tempTable 是 String[][],Column Names 是 String[]。我相信这个问题是由 new DefaultTableModel() 没有为表模型指定数据和列名引起的。如何在数据模型中指定这些。我尝试了 table.setModel (tableModel(tempTable, columnNames));,但这会导致“找不到符号”错误。【参考方案4】:table.setDefaultEditor(Object.class, null);
【讨论】:
这是最好和最简单的答案。当然,您必须将编辑器设置为 null,这样您就无法对其进行编辑。 这适用于单选。这是我的要求。 这应该是答案!【参考方案5】:创建新的 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()));
【讨论】:
【参考方案6】:如果您从一组值(使用“new JTable(Vector, Vector)”)自动创建 TableModel,那么从列中删除编辑器可能更容易:
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
没有编辑器,数据将无法编辑。
【讨论】:
-1 在不适当的位置进行随机黑客攻击是从不选项 拜托,您能解释一下为什么这是“在不适当的位置进行的随机黑客攻击”吗?根据setDefaultEditor() doc:“如果 editor 为 null,则删除此列类的默认编辑器。” 是的,并且回退到 Object 的默认值 ;-) 所以你并没有真正禁用编辑(如果其中一列是 Object 类型,只是不小心),你也错过了任何列可能有一个自定义编辑器。 是 api旨在实现控制单元格可编辑性,这就是模型的。其他一切都是黑客行为,因此不合适。 我明白你的意思。但是我从 api 中了解到的是,如果我以快速方式创建一个表(使用“new JTable(Vector, Vector)”),那么该表的所有列都将具有默认编辑器。因此,如果我运行“table.setDefaultEditor(column, null)”,那么我将从列中删除默认编辑器,因此该列将没有任何编辑器,并且该列将不可编辑。会吗? 我以new JTable(Vector, Vector)
的方式创建了表格并为我工作。我不需要任何单元格的编辑,所以你有我的投票权。【参考方案7】:
只需添加
table.setEnabled(false);
对我来说很好用。
【讨论】:
如果您不使用自定义表格模型,那就太好了! 但您将无法选择单元格或行。 这在某些 L&F 中看起来会“变灰”。 那行得通。谢谢。但是,我还是想知道为什么nelson的数据模型方法会导致表格的列和数据元素消失。 很适合我!以上是关于如何使 JTable 不可编辑的主要内容,如果未能解决你的问题,请参考以下文章