2010-08-13 59 views
2

我有一張關閉AbstractTableModel的表。表中的數據存儲在Vector中。 現在,當我刪除一行時,我正在從矢量中成功刪除它,但是在視圖中(即在GUI中)沒有更新它。Java Swing - 使用AbstractTableModel從表中刪除行

我看別的地方,我需要使用fireTableRowsDeleted(),而我想在我AbstractTableModel上調用它的包裝方法中:

dataModel = new AbstractTableModel() { 
      public void removeAl() { 
        fireTableRowsDeleted(0, getRowCount()-1); 
      } 
}; 

但是,這removeAl不適合我訪問。我無法在任何地方稱呼它:dataModel.removeAl()

你能幫我理解一下怎麼回事嗎?如何在刪除行時更新GUI?編號: 事實證明,問題在於其他地方。一旦我解決了這個問題,從Vector中刪除行開始更新GUI。 :)

+0

我會迴應,但請先接受一些答案。 – 2010-08-13 01:36:11

+0

@Romain stackoverflow.com的目的是分享知識,而不是積累信譽得分。 – 2010-08-13 04:25:21

+0

我很抱歉不注意。我已經接受了我現在所有問題的答案。你能重新考慮回答我嗎? – Chaitanya 2010-08-13 06:00:59

回答

1

您看不到您的removeAll方法是因爲它是在匿名類中聲明的 - 匿名類不能通過名稱引用,其中的任何新聲明都無法訪問。出於這個原因,匿名類中的公共聲明通常是覆蓋,因爲它們將通過使用非匿名基類來提供。

爲了解決這個問題,聲明你的表格模型的AbstractTableModel

public class MyTableModel extends AbstractTableModel { 

    public void removeAll() { 
     fireTableRowsDeleted(...); 
    } 
} 

你的客戶端代碼正規的子類,然後將要轉換爲MyTableModel訪問removeAll()方法。

更簡單但較差的解決方案是繼續讓客戶使用AbstractTableModel,並讓客戶明確地呼叫fireTableRowsDeleted()

+0

感謝您的回覆。我會試試這個,讓你知道它是怎麼回事。 – Chaitanya 2010-08-13 06:01:24

3

除了搖頭丸什麼說,你還需要從TableModel接口重寫以下方法(他們留下的AbstractTableModel沒有實現),因此你不能實例任何AbstractTableModel子類,除非它確實重寫這些方法:

public int getRowCount(); 
public int getColumnCount(); 
public Object getValueAt(int row, int column); 

最後,僅僅在您的removeAll()方法中刪除tableRowsDeleted方法是不夠的,您需要對3個以前的方法返回的內容產生影響;即removeAll()被調用後,您應確保getRowCount()返回0,否則您將遇到問題(最差情況下爲NullPointerException或等效,最佳情況下爲JTable刷新問題)!

也許你最好在第一步使用DefaultTableModel,這可能會讓你更容易。從AbstractTableModel派生將來得晚。這幾乎取決於你想要做什麼...