2013-11-03 82 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(); 
    } 
} 

請注意,它不檢查列是否可以刪除。