2011-12-05 21 views
0

我意識到一個JTable具有自定義AbstractTableModel用於實現分頁。 我想每頁顯示5項,但我有一個問題:如果我有N項顯示(N是5的倍數),一切都可以,但如果我例如有14個元素顯示,我得到一個異常。問題在於獲取每個單元格值的方法超出了限制範圍。尤其是,問題出在方法Multipage JTable:不可能顯示比行更少的項目

public Object getValueAt(int row, int col) { 
    int realRow = row + (pageOffset * pageSize); 
    return data[realRow].getValueAt(col); 
} 
其實

,我們有5行(0-4)和14元,但很明顯,當我們試圖獲得最後一個元素,我們這樣做:realRow = 4 + (2*5)和清楚我有第14行沒有元素。 我該如何解決這個問題?我怎麼能告訴我的計劃,一旦到達第14檔就停止獲得價值?可能嗎?

+0

也許你可以澄清:在你的代碼,什麼是pageOffset和pageSize?這些不是任何標準的tableModel字段,所以瞭解它們的用途將幫助我們理解您的問題。 – Colby

+0

pageOffset是頁碼(pageOffset = 0表示0到4的項目,1表示5到9的項目,2表示10到14的項目) pageSize是每頁元素的數量(在這種情況下等於5) – Michele

回答

1

只是釘住值其可接受的最大:

realRow = Math.min(realRow, getRowCount()); 

附錄:在example cited,實現getValueAt()如下:

// Work only on the visible part of the table. 
public Object getValueAt(int row, int col) { 
    int realRow = row + (pageOffset * pageSize); 
    if (realRow < data.length) { 
     return data[realRow].getValueAt(col); 
    } else { 
     return null; 
    } 
} 

還要考慮BasicArrowButton

+0

但是,她會得到一個不存在的行的值,這不是對異常的改進。它只是掩蓋了這個問題,這是一個不適當的開發模式。 – Colby

+0

根據引用的示例進行更新。 – trashgod

1

確保您的模型的getRowCount方法與您想要的內容一致。 getRowCount方法應該爲您的表返回可接受的數字,以便它不針對任何不存在的行調用getValueAt。所以,如果你沒有第14行,你的行數不應該那麼高。

+0

我的getRowCount是 'return Math.min(pageSize,data.length);' – Michele

+0

因此,'data'字段是整個表跨多個頁面的數據,還是每個頁面的data不同? – Colby

+0

數據字段是跨多個頁面的整個表的數據 – Michele

1

我認爲不easy job,我suggessting看aephyr's code,也許更多easies方式實施這一code,但真正的效果,你必須鎖定JScrollBars,SWITH到NEVER

+0

你是對的;很好的例子。 – trashgod

+0

我已經看到這兩個鏈接你發佈,實際上我使用其中的第二個。但它只適用於每個頁面顯示的元素數完全可分割的元素(保留0) – Michele