在JTable中分页数据

时间:2010-02-17 09:53:57

标签: java swing jtable

我的Jpanel中有一个jbutton。当我点击它时,它会加载我的Jtable,有时一个查询会返回这么多记录(500行)。所以我想将它限制为5条记录。

当查询返回时我想要计算它;如果它高于5,则Jtable仅显示前5条记录,当用户单击“前进”按钮时,它将显示接下来的5条记录。当用户单击“返回”按钮时,它将显示之前的5条记录。

我该怎么做? TableModel有这方面的例子吗?

2 个答案:

答案 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