2013-11-03 79 views
4

我不知道该怎么做。我正在创建一个应用程序。我需要使用表格,所以我使用JTable。但是我有很多问题。 它似乎工作,但当我尝试删除列时,此列消失(仅在GUI中),但所有信息仍然存在。另外columncount不会更改。
我已经搜索并尝试了很多不同的代码,但没有改变。如何插入/删除列到JTable java

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--; 
     }; 
+0

您要求我们猜测没有代码的情况,没有详细信息。我们可能会向您提供一般建议,但对于具体建议,您需要展示并向我们提供更多信息。最好是你创建并发布[sscce](http://sscce.org)。 –

+0

它有助于记住JTable不是电子表格,并且不像电子表格那样工作。 –

回答

6

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

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

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

如果它显示示例 – CROSP

+0

@AlexandrCrospov,或者您可以尝试自己编写代码。这可能是3-5行代码。你需要一个循环。在循环内部一条语句从Vector中删除该条目。循环之外的另一行代码来调用fireXXX方法。如果您努力并发布您的[SSCCE](http://sscce.org/)显示您尝试过的内容,那么我们可以提供更多帮助,但我们不在这里为您编写代码。 – camickr

3

一些有关您的问题的一般信息。

JTable APIpublic void removeColumn(TableColumn aColumn)明确规定:

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

因此,您所遇到的行为是可以预料的。如果你试图从模型中删除数据,那么你将不得不改变你的TableModel的数据和ColumnModel。再次为更具体的帮助,你需要告诉我们更多。

考虑创建一个自定义表模型并给它一个removeColumn(...)方法,该方法从一列中删除所有数据,然后调用相应的fireXXX(...)方法。


编辑
幽州的评论:

THX的答案,我是新手。这个编制对我来说是浪费了两天的时间来创作它,现在再次遇到问题。什么是最简单的方法?

这一切都取决于你想要做什么。如果您只想更改显示内容,请按照原样移除列,并保留数据。

+0

THx回答,我是新手。这个编制对我来说是浪费了两天的时间来创作它,现在再次遇到问题。 请建议,解决这个问题最简单的方法是什么? – CROSP

+0

@AlexandrCrospov:请参阅编辑以回答。 –

+1

我需要删除列中的所有数据,或者只是将列替换为下一列。可能更容易更换所需索引列? – CROSP

0

根据camickr's solution,我将这段代码写入remove列的JTable

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(); 
    } 
} 

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