0 votes

Afficher les données dans une table JT avec le nombre maximal de personnes.

Il y a un bouton J dans mon Jpanel, quand je clique dessus, il charge ma Jtable, parfois une requête renvoie tant d'enregistrements (500 lignes). Lorsque la requête est renvoyée, je veux la compter si elle est supérieure à 5, alors la table J n'affiche que les 5 premiers enregistrements, lorsque l'utilisateur clique sur le bouton Forward, il affiche les 5 enregistrements suivants, et lorsque l'utilisateur clique sur le bouton Back, il affiche les 5 enregistrements précédents.

Quelqu'un peut-il m'aider ? Existe-t-il un exemple de ce type avec TableModel ?

j'en ai besoin d'urgence. merci les gars.

2voto

Luhar Points 1014

Si vous souhaitez charger un grand tableau, vous pouvez utiliser un SwingWorker (détails aquí ) pour charger le tableau en arrière-plan. Le chargement d'un tableau de 500 lignes ne devrait pas poser de problème. Vous pouvez ensuite placer les données dans un format d'objet approprié et les transmettre à votre TableModel.

Si vous décidez d'utiliser une liste par exemple, vous pouvez avoir deux listes dans votre modèle de table :

List allData
List viewData
int startIndex

La liste viewData est ce qui est référencé par la méthode getValueAt(..) dans votre implémentation de l'interface TableModel. La liste viewData est toujours un sous-ensemble (lié par startIndex, de longueur 5) de allData. Lorsque l'utilisateur clique sur "Next", votre écouteur d'action peut appeler une méthode sur le modèle Table qui incrémente startIndex de 5 (ou autre). Vous régénérez ensuite votre instance viewData pour qu'elle soit le sous-ensemble approprié de 5 lignes de allData, et appelez fireTableChanged(). Cela sera facile si vous avez étendu AbstractTableModel en premier lieu.

Cela devrait être assez simple à mettre en œuvre. Je pense que c'est mieux que de faire un appel à la base de données chaque fois que vous voulez obtenir le prochain ensemble de données. Je pense qu'il est préférable de prendre un peu plus de temps en amont pour précharger les données.

2voto

Adamski Points 29884

Je suggère de mettre en place un système de "pagination" TableModel qui offre une fenêtre sur l'ensemble des données et des méthodes pour se déplacer en avant et en arrière dans les données. De cette façon, vous n'avez pas besoin de deux List pour stocker les données, mais plutôt un seul List qui contient toutes les données ainsi qu'un marqueur de votre position actuelle ; par ex.

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();
}

Comme le mentionne 00rush, une approche plus ambitieuse consisterait à utiliser un fichier de type SwingWorker pour transmettre les données en arrière-plan. Vous pouvez toujours utiliser la fonction de pagination TableModel Il suffit de s'assurer que les services appropriés sont disponibles. TableModelEvent sont déclenchés au fur et à mesure que vous ajoutez des éléments à la fin du fichier allData liste.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X