11
votes

Posiler une énorme table dans l'application SWT / JFACE RCP

Comment allez-vous afficher une énorme quantité de lignes dans la table SWT? Énorme est quelque chose au-dessus de 20 000 rangées, 20 colonnes. Ne me demandez pas pourquoi j'ai besoin de montrer que beaucoup de données, ce n'est pas le point. Le but est de savoir comment le faire fonctionner aussi vite que possible afin que l'utilisateur final ne soit pas ennuyé en attente. Chaque ligne affiche une instance de certains objets, les colonnes sont ses propriétés (certaines). Je pensais utiliser le modèle de fournisseur de contenu / étiquette Jface, mais j'ai peur qu'il ne soit même plus lent que de frapper la table directement avec les données. C'est comme ça que ça se passe: xxx p> dessin 20k enregistrements sur mon ordinateur prend environ 20 secondes. Le plus gros problème de performance que j'ai vu dans Windows est causé par une quantité incroyable de messages de fenêtres natives envoyés par SWT lorsque le nouvel élément de table créé et peuplé avec du texte. J'ai trouvé une excellente solution de contournement pour cela - Masquer la table avant de remplir, puis le montrer lorsque vous avez terminé. Juste appeler table.setVisible (Faux) avant la boucle et la table.setVisible (Vrai) après que la boucle se demande - la vitesse monte six-sept fois!

J'aimerais accélérer encore plus. Que suggérerais-tu ? En outre, je me demande comment cette astuce cachée au widget fonctionnerait sur des implémentations non-Windows de SWT (AKA Linux)?


0 commentaires

3 Réponses :


2
votes

Vous voulez faire du chargement paresseux sur l'affichage de la table. Fondamentalement, vous gardez tous ces objets offscreen en mémoire, puis créez seulement une poignée de lignes de table GUI. Lorsque l'utilisateur fait défiler, vous rendant ces lignes avec les objets à cet emplacement de défilement.

voir Cet article ( Modifier: Oups, je voulais dire Cet article ) Pour un exemple Jface.


2 commentaires

Merci pour l'indice, le dessin paresseux ressemble à une bonne idée. Bien que je ne voie pas comment cet extrait est différent de la mienne, il court sur tous les articles et le dessine un par un ...


Ooops! Mauvais lien, site droit! Voici celui-ci pour une table SWT avec un million de lignes: Java2S. com / code / java / swt-jface-éclipse / ... . Il suffit de remplacer le bouton "Ajouter des éléments" et de réactiver son auditeur en tant qu'amardeur de défilement qui charge des éléments futurs une fois que vous êtes approché de la fin de l'ensemble actuel. Bonne chance!



2
votes

1 - Utilisez le Settext (String []) au lieu de Settext (int, String) Un appel au lieu de plusieurs.

2 - Utilisez MyTable.SeRedraw (FALSE) avant et MyTable.StreDraw (true) après le processus d'arrêt de toutes les opérations de redessinement lors de la chargement des données.

C'est plus simple et peut améliorer les performances !!

bonne chance.

sur mon côté à l'aide de cela, je charge 2500 lignes de 20 colonnes en moins de 300 ms ..... sur une standard aujourd'hui PC.


0 commentaires

19
votes

SWT peut le faire pour vous. Lorsque vous utilisez le drapeau de style SWT.VIRTUAL, les éléments ne sont créés que lorsqu'ils sont défilés dans la vue. Voici comment le faire:

  1. Créez la table avec style SWT.VIRTUAL
  2. Définissez le nombre de lignes à l'aide de la table # SettitemCount ()
  3. Ajoutez un auditeur SWT.SETDATA qui remplit la table de la table à la demande.

    Voici un code de code: xxx


5 commentaires

C'est exactement la solution, maintenant remplir 100k rangées prend presque zéro Time, une caractéristique assez incroyable, merci un tas!


@RALFSTX pouvez-vous me dire comment puis-je filtrer une table comme celle-ci?


@Adamarold Vous pouvez jeter un coup d'œil sur deferredContentProvider pour ceci (voir par exemple ce tutoriel ). Mais vous devez savoir qu'il pourrait y avoir des problèmes avec rafraîchissement lors du défilement: Bugs. eclipse.org/bugs/show_bug.cgi?id=146799


@RALFSTX J'utilise JFACE TableViewer's ContentProvider et LabelProvider pour remplir les données des rangées et des colonnes. Par conséquent, je ne peux pas suivre les étapes 2,3 que vous avez énumérées. Donc, l'heure de chargement pourrait-elle s'améliorer si j'utilise SWT.Virtual sur la vision de TableViewer seule?


@ user1168608 Non, l'idée de tables virtuelles est que vous créez des articles à la demande . Si vous ne le faites pas, le drapeau virtuel ne vous achète rien.