如何使 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

然后使用JTablesetModel() 方法。

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 不可编辑的主要内容,如果未能解决你的问题,请参考以下文章

java中如何把JTable设置为不可编辑

使用netbeans设计中心使一个jtable列不可编辑

仅在选择时设置Jtable单元格可编辑

Java Swing Jtable 单元格不可编辑

如何使pb数据窗口不可编辑变为可编辑

你好,我看你关于jtable的编辑列改为非编辑列, 你知道jqgrid的编辑列如何停止编辑吗?