Пагинация данных в JTable - PullRequest
0 голосов
/ 17 февраля 2010

В моей Jpanel есть кнопка. Когда я щелкаю по нему, он загружает мой Jtable, иногда запрос возвращает столько записей (500 строк). Поэтому я хочу ограничить его 5 записями.

При возврате запроса я хочу его посчитать; если оно больше 5, то Jtable показывает только первые 5 записей, когда пользователь нажимает кнопку «Вперед», он показывает следующие 5 записей. Когда пользователь нажимает кнопку «Назад», он показывает предыдущие 5 записей.

Как я могу это сделать? Есть ли пример для этого с TableModel?

Ответы [ 2 ]

2 голосов
/ 17 февраля 2010

Я предлагаю реализовать «Paged» TableModel, который предоставляет окно для всего набора данных и методы для перемещения вперед и назад по данным. Таким образом, вам не требуется два List s для хранения данных, а один 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; вам просто нужно убедиться, что соответствующие TableModelEvent запущены при добавлении в конец списка allData.

2 голосов
/ 17 февраля 2010

Если вы хотите загрузить большую таблицу, вы можете использовать поток SwingWorker (подробности здесь ) для загрузки таблицы в фоновом режиме. Загрузка таблицы с 500 строками не должна быть проблемой. Затем вы можете поместить данные в подходящий формат объекта и передать их в TableModel.

Если вы решите использовать Список, например, в вашей табличной модели у вас может быть два списка:

List allData
List viewData
int startIndex

Список viewData - это то, на что ссылается метод getValueAt (..) в вашей реализации интерфейса TableModel. Список viewData всегда является подмножеством (ограниченным startIndex длиной 5) всех данных. Когда пользователь нажимает «Далее», слушатель действия может вызвать метод в модели таблицы, который увеличивает startIndex на 5 (или что-то еще). Затем вы регенерируете свой экземпляр viewData, чтобы он представлял собой подходящее подмножество из 5 строк allData, и вызываете fireTableChanged (). Это будет легко, если вы сначала расширили AbstractTableModel .

Это должно быть довольно просто реализовать. Я думаю, что это лучше, чем делать вызовы из базы данных каждый раз, когда вы хотите получить следующий набор данных. ИМХО, лучше предварительно потратить немного времени на предварительную загрузку данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...