2010-02-17 68 views
0

在我的Jpanel中有一个jbutton,当我点击它时,它加载了我的Jtable,有时候查询返回了很多记录(500行)。所以我想限制它与5 record.When查询返回我想要数它,如果它的高于5然后Jtable显示只有前5个记录,当用户单击前进按钮时,它会显示下5记录。当用户单击后退按钮时,它会显示前5条记录。在最大计数中显示JTable中的数据

任何人都可以帮助我吗? TableModel有没有这样的例子?

我急需这个。 thanx guyz。

回答

2

我建议实施一个“分页”TableModel,它提供了一个窗口到整个数据集和方法在整个数据中向前和向后移动。这样,您不需要两个List来存储数据,而是一个List保存所有数据以及标记到当前位置;例如

public class ImmutablePagedTableModel extends AbstractTableModel { 
    private final List<MyBusinessObject> allData; 
    private final int pageSize; 
    private int pos; 

    public ImmutablePagedTableModel(List<MyBusinessObject> allData) { 
    // Copy construct internal list. Use ArrayList for random access look-up efficiency. 
    this.allData = new ArrayList<MyBusinessObject>(allData); 
    } 

    /** 
    * Returns true if the model has another page of data or false otherwise. 
    */ 
    public boolean hasNextPage() { 
    return pos + pageSize < allData.size(); 
    } 

    /** 
    * Flips to the next page of data available. 
    */ 
    public void nextPage() { 
    if (hasNextPage()) { 
     pos += pageSize; 

     // All data in the table has effectively "changed", so fire an event 
     // causing the JTable to repaint. 
     fireTableDataChanged(); 
    } else { 
     throw new IndexOutOfBoundsException(); 
    }  
    } 

    public int getRowcount() { 
    return Math.min(pageSize, allData.size() - pos); 
    } 

    // TODO: Implement hasPreviousPage(), previousPage(); 
} 

作为00rush提到了一个更宏大的方法将是使用一个SwingWorker在背景中的数据串流。你仍然可以使用分页的TableModel方法;您只需确保在追加到allData列表末尾时触发适当的TableModelEvent

2

如果您希望加载大型表格,则可能需要使用SwingWorker(详细信息here)线程在后台加载表格。装载500行的表格不应该是个问题。然后,您可以将数据转换为合适的对象格式并将其传递给TableModel。

如果你决定使用例如一个列表,在表的模型,你可以有两个列表:

List allData 
List viewData 
int startIndex 

的可视数据列表什么是由getValueAt(..)方法在执行引用TableModel接口。 viewData列表始终是allData的一个子集(由startIndex绑定,长度为5)。当用户点击“下一步”时,你的动作监听器可以调用表模型上的一个方法,将startIndex增加5(或其他)。然后,您重新生成viewData实例,以便它是allData的适当的5行子集,并调用fireTableChanged()。如果您首先扩展了AbstractTableModel,这将很容易。

这应该是相当直接的实施。我认为每次你想要获得下一组数据时都要进行数据库调用。恕我直言,它更好地预先花一点时间预先加载数据。

+1

Adamski上面的方法比使用2个列表更优雅。我仍然建议使用SwingWorker来预加载数据。 – Luhar 2010-02-17 10:49:01