【问题标题】:Deleting all the rows in a JTable删除 JTable 中的所有行
【发布时间】:2011-09-08 02:36:58
【问题描述】:

我需要删除 JTable 中的所有行。

我已经尝试了以下两种方法:

/**
 * Removes all the rows in the table
 */
public void clearTable()
{
    DefaultTableModel dm = (DefaultTableModel) getModel();
    dm.getDataVector().removeAllElements();
    revalidate();
}

((DefaultTableModel)table.getModel()).setNumRows(0);

两者都不会删除所有行。有什么想法吗?

【问题讨论】:

  • @MByD 我刚刚添加了 revalidate(),但仍然看到相同的内容。我正在使用 CustomeTableCellRenderer,但我认为这不会做太多。
  • 我也试过这个。没有运气。我认为还有其他事情发生。
  • @MByD,不,你不应该 revalidate() 或 repaint()。 TableModel 负责通知 JTable 发生了一些变化,以便表格可以自动重新绘制自己。
  • @camickr - 供参考:)
  • 投票以非真实问题的形式结束 - 发布后无法回答,并且会引发一个又一个不正确的伪答案...

标签: java swing jtable


【解决方案1】:

我们可以为此使用 DefaultTableModel.setRowCount(int),参考 Java 的文档:

公共无效setRowCount(int rowCount)

设置模型中的行数。如果新尺寸大于 当前大小,新行将添加到模型的末尾如果 新大小小于当前大小,索引 rowCount 处的所有行 和更大的被丢弃

这意味着,我们可以像这样清空一个表:

DefaultTableModel dtm = (DefaultTableModel) jtMyTable.getModel();
dtm.setRowCount(0);

现在,关于“java 如何丢弃这些行?”,我相信它最终只是调用了一些类似 C 的 free(void*),或者它只是删除了对该内存区域的所有引用并将其留给 GC关心一下,关于这个函数在内部是如何工作的,文档不是很清楚。

【讨论】:

  • 伟大而简单的代码。虽然这个问题的标记答案也是正确的,但在删除数千行时会出现问题。如果您要处理数千行,则此代码非常简单。
  • 这个清除所有表格行。简单易用。谢谢
  • 这是最好的答案。
  • mee 的最佳答案也是如此,因此不必在所有表行中进行迭代。我会说一个很奇怪的方法。
【解决方案2】:

以下代码对我有用:

DefaultTableModel dm = (DefaultTableModel) getModel();
int rowCount = dm.getRowCount();
//Remove rows one by one from the end of the table
for (int i = rowCount - 1; i >= 0; i--) {
    dm.removeRow(i);
}

【讨论】:

  • -1,实际上,这段代码不起作用。首先删除第 0 行,然后所有行向下移动 1。然后删除第 1 行,这意味着第 0 行仍然存在。 James_Bond 的回答显示了如何通过从结尾而不是开头删除来完成此操作。
  • 是的,你没看错,数组元素必须从后往前移除。
  • 无需循环 - DefaultTableModel 具有 api 可通过单个方法调用清除所有行 ...
  • 想知道这段代码如何与i++一起工作。应该是i--
  • 不行,只会删除一半的表,之后会抛出异常。您可以将循环内的i 替换为0
【解决方案3】:

这样的东西应该可以工作

DefaultTableModel model = (DefaultTableModel)this.getModel(); 
int rows = model.getRowCount(); 
for(int i = rows - 1; i >=0; i--)
{
   model.removeRow(i); 
}

【讨论】:

  • 假设一个典型的类似数组的背景,这比从前到后移除元素要好得多。
  • btw:应该是DefaultTableModel,TableModel没有removeRow方法
  • 不需要循环,只需使用用于清除数据的api(不是太明显,但你可能会阅读@camickr的答案 - 其中提到了不推荐使用的方法)
【解决方案4】:

阅读 DefaultTableModel 的 API - setRowCount 方法支持一次性删除/丢弃所有行...

((DefaultTableModel)myTable.getModel()).setRowCount(0);

【讨论】:

  • 正确,但没有什么新鲜的:已经有 an earlier answer 指向那个确切的方法 :-) 加上不止一个指向旧的 api ..
【解决方案5】:

好吧,setNumRows(0) 应该可以工作,尽管如果您实际阅读 API,它会告诉您此方法已过时并告诉您改用哪种方法。

如果代码不起作用,那么你做错了什么,我们无法从发布的代码中看出那可能是什么。

发布您的SSCCE 来证明问题。

【讨论】:

    【解决方案6】:

    从JTable中删除所有行的最简单方法,只需使用此方法...

    tablemodel.getDataVector().removeAllElements();
    tablemodel.fireTableDataChanged();
    

    tablemodel 是您为表创建的用于添加新行的模型。这是删除所有行的最短和最快的方法,因为如果您有数千行怎么办?循环播放?

    【讨论】:

    • 可能看起来很简单 - 但实际上是错误:a) 一般规则是永远不要从模型外部调用任何 fireXX,通知其侦听器是模型本身。 b) DefaultTableModel api来清除删除所有行(虽然它的名字很不幸),绝对不需要与底层数据结构交互
    • @kleopatra 你能解释一下你所说的规则吗?我不明白为什么我不能使用任何 fireXX 方法,因为它们是公共的并且默认实现可访问!
    • 这是一个设计上的意外,他们是公开的 - 简单的 OO 理智要求 a) 类完全完成它的工作,b) 外人永远不会接管其他人负责的工作
    【解决方案7】:
    try{
    
        DefaultTableModel dtm = (DefaultTableModel) jTable2.getModel();
    
        dtm.setNumRows(0); 
    
    }catch(Exception e){
    }
    

    【讨论】:

      【解决方案8】:

      或者如果您有很多行但很少列...

      DefaultTableModel dtm = new DefaultTableModel();
      for(int i=0;i<NUM_COLS;i++) dtm.addColumn(COLUMN_NAME[i]);
      myTable.setModel(dtm);
      

      ...用新的 DTM 替换旧的 DTM。

      【讨论】:

      • 虽然可能,但不推荐(特别是,因为不需要,DTM api 来删除所有行) - 这意味着旧模型的侦听器必须重新连接到新模型。不过,这不是火箭科学,只是不必要的复杂性;-)
      【解决方案9】:

      我有多个表,所以我创建了一个清除“任何”表的方法:

      private void deleteAllTableRows(JTable table) {
          DefaultTableModel model = (DefaultTableModel) table.getModel();
          while( model.getRowCount() > 0 ){
              model.removeRow(0);
          }
      }
      

      【讨论】:

        【解决方案10】:
        DefaultTableModel tm = (DefaultTableModel) tbl.getModel();
        while(tbl.getRowCount() > 0)
        {
            ((DefaultTableModel) tbl.getModel()).removeRow(0);
        }
        

        【讨论】:

        • 虽然此代码可能有助于回答问题,但仅代码的答案质量不高。更好的答案是解释代码的作用,告诉在哪里插入,解释为什么采用这种方法,并链接到相关文档。
        【解决方案11】:
        MyModel myTableModel = (MyModel) myTable.getModel();
        for (int i = myTableModel.getRowCount()-1; i >= 0; i--) myTableModel.deleteRow(i);
        

        【讨论】:

          【解决方案12】:

          你不能在这里简单地使用 for 循环,因为在每个循环中你都会删除一行,这会减少行数。这是正确的:

          int count = tmodel.getRowCount();
              while(count > 0) {
                  tmodel.removeRow(count-1);
                  count = tmodel.getRowCount();
              }
          

          【讨论】:

            【解决方案13】:

            这对我有用,只需使用

            tableModel.setRowCount(0);tableModel.setNumRows(0);

            设置模型中的行数。如果新尺寸大于 当前大小,新行将添加到模型的末尾如果 新大小小于当前大小,索引 rowCount 处的所有行和 更大的被丢弃。参数:rowCount - 模型中的行数

            通过将行数设置为零,您是在告诉表 moble 没有行,这会使表为空。

            【讨论】:

              【解决方案14】:

              试试这个代码。这将从 JTable 中删除所有行。

              DefaultTableModel model=new DefaulTableModel(rows,cols);
              JTable table=new JTable(model);
              for(int i=0;i<model.getRowCount();i=i+0)
              {
               model.removeRow(0);
               revalidate();
               }
              

              【讨论】:

              • -1 叹息 - 错误答案的另一种变体...... NO 根本不需要循环,NO 甚至无需重新验证该循环中的任何内容
              猜你喜欢
              • 2012-06-18
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-03-07
              • 1970-01-01
              • 1970-01-01
              • 2013-06-27
              • 1970-01-01
              相关资源
              最近更新 更多