【问题标题】:How to make a JTable non-editable如何使 JTable 不可编辑
【发布时间】:2010-12-31 17:46:15
【问题描述】:

如何使JTable 不可编辑?我不希望我的用户能够通过双击单元格中的值来编辑它们。

【问题讨论】:

标签: java swing 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的数据模型方法会导致表格的列和数据元素消失。
    • 很适合我!
    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    相关资源
    最近更新 更多