【问题标题】:How to insert/delete column to JTable java如何在 JTable java 中插入/删除列
【发布时间】:2013-11-14 11:56:58
【问题描述】:

我不知道该怎么做。我正在创建一个应用程序。我需要使用表格,所以我使用的是 JTable。但我有很多问题。 它似乎有效,但是当我尝试删除列时,该列消失(仅在 GUI 中),但所有信息仍然存在。列数也不会改变。
我搜索并尝试了很多不同的代码,但没有任何改变。

 public void addTblCol(JTable table,String name) {
    DefaultTableModel model = (DefaultTableModel)table.getModel();
     TableColumn col = new TableColumn(model.getColumnCount());

    col.setHeaderValue(name);
    table.addColumn(col);
    model.addColumn(name);
    this.realColCnt++;
      };
public void delTblCol(JTable table,int index) {
            DefaultTableModel model = (DefaultTableModel)table.getModel();
          TableColumn col = table.getColumnModel().getColumn(index);
    table.removeColumn(col);
    table.revalidate();
    this.realColCnt--;
      };

【问题讨论】:

  • 您要求我们在没有代码、没有细节的情况下猜测哪里出了问题。我们或许可以为您提供一般性建议,但对于具体建议,您需要展示并告诉我们更多信息。最好让您创建并发布sscce
  • 记住 JTable 不是电子表格,其行为也不像电子表格。

标签: java swing jtable


【解决方案1】:

DefaultTableModel 支持setColumnCount() 方法,该方法有效地允许您仅从模型末尾删除列。

如果你想从模型中间移除列,那么你需要:

  1. 扩展DefaultTableModel 并创建您自己的removeColumn(int column) 方法。
  2. 此方法需要遍历 Vector 中的每一行,并使用 Vector.remove(int) 方法删除该列 for ever row。
  3. 最后,完成此操作后,您需要调用 fireTableStructureChanged() 方法来告诉表已删除列,以便重新绘制表。

【讨论】:

  • @AlexandrCrospov,或者您可以尝试自己编写代码。它可能是 3-5 行代码。你需要一个循环。在循环内部,一条语句从 Vector 中删除该项目。在循环之外的另一行代码调用 fireXXX 方法。如果您努力并发布您的SSCCE 显示您尝试过的内容,那么我们可以提供更多帮助,但我们不是来为您编写代码的。
【解决方案2】:

与您的问题相关的一些一般信息。

public void removeColumn(TableColumn aColumn)JTable API 明确声明:

从此 JTable 的列数组中删除 aColumn。 注意:此方法不会从模型中删除数据列;它只是删除了负责显示它的 TableColumn。

因此,您遇到的行为是意料之中的。如果您尝试从模型中删除数据,那么您将不得不更改 TableModel 的数据和 ColumnModel。同样,如果您需要更具体的帮助,您需要告诉我们更多信息。

考虑创建一个自定义表模型并为其提供一个removeColumn(...) 方法,该方法从单个列中删除所有数据,然后调用适当的fireXXX(...) 方法。


编辑
您在评论中声明:

谢谢回答,我是新手。这个 prog 非常适合学习,我浪费了两天时间来创建它。现在又遇到了问题。最简单的方法是什么?

这一切都取决于你想做什么。如果您只想更改显示,请照常删除该列并保留数据。

【讨论】:

  • 谢谢回答,我是新手。这个 prog 非常适合学习,我浪费了两天时间来创建它。现在又遇到了问题。请建议,解决这个问题的最简单方法是什么?
  • @AlexandrCrospov:请参阅编辑以回答。
  • 我需要从列中删除所有数据,或者只需将列替换为下一列。用所需索引替换列可能更容易吗?
【解决方案3】:

基于camickr's solution,我将这段代码写到removeJTable中的一列。

public class CustomTableModel extends DefaultTableModel {
    public void removeColumn(int column) {
        // for each row, remove the column
        Vector rows = dataVector;
        for (Object row : rows) {
            ((Vector) row).remove(column);
        }

        // remove the header
        columnIdentifiers.remove(column);

        // notify
        fireTableStructureChanged();
    }
}

请注意,它不会检查列是否可以删除。

【讨论】:

    【解决方案4】:
    jTable1.removeColumn(jTable1.getColumnModel().getColumn(0));
    
    1. 将 jTable1 替换为您的表名。
    2. 根据您的表格更改“getColumn(0)”内的索引号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-23
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 1970-01-01
      • 2010-12-06
      相关资源
      最近更新 更多