我的Jpanel中有一个jbutton。当我点击它时,它会加载我的Jtable,有时一个查询会返回这么多记录(500行)。所以我想将它限制为5条记录。
当查询返回时我想要计算它;如果它高于5,则Jtable仅显示前5条记录,当用户单击“前进”按钮时,它将显示接下来的5条记录。当用户单击“返回”按钮时,它将显示之前的5条记录。
我该怎么做? TableModel有这方面的例子吗?
答案 0 :(得分:2)
如果要加载大表,可能需要使用SwingWorker(详细信息here)线程在后台加载表。加载500行的表应该不是问题。然后,您可以将数据放入合适的对象格式并将其传递给TableModel。
如果您决定使用List,例如,在您的表模型中,您可以有两个列表:
List allData
List viewData
int startIndex
viewData列表是TableModel接口实现中getValueAt(..)方法引用的内容。 viewData列表始终是allData的子集(由startIndex绑定,长度为5)。当用户单击“下一步”时,您的动作侦听器可以调用Table模型上的方法,该方法将startIndex增加5(或其他)。然后重新生成viewData实例,使其成为allData的相应5行子集,并调用fireTableChanged()。如果您首先扩展AbstractTableModel,这将很容易。
实施起来应该非常简单。我认为它比每次想要获取下一组数据时都要调用数据库更好。恕我直言,最好花一点时间预先加载数据。
答案 1 :(得分:2)
我建议实现一个“分页”TableModel
,它为整个数据集提供了一个窗口,以及在整个数据中向前和向后移动的方法。这样,您不需要两个List
来存储数据,而是需要一个List
将所有数据与标记一起保存到当前位置; e.g。
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
方法;您只需确保在附加到TableModelEvent
列表末尾时触发相应的allData
。