Question

Comment iriez-vous sur l'affichage énorme quantité de lignes dans le tableau de SWT? Immense est quelque chose au-dessus de 20K lignes, 20 colonnes. Ne me demandez pas pourquoi je dois montrer que beaucoup de données, ce n'est pas le point. Le point est de savoir comment faire fonctionner aussi vite que possible afin que l'utilisateur final ne se attente ennuyer. Chaque ligne contient une instance d'un objet, les colonnes sont ses propriétés (certaines). Je pensais utiliser modèle de fournisseur de contenu / étiquette JFace, mais peur que ce sera encore plus lent que de frapper la table directement avec les données. Voici comment ça se passe:

    Display.getDefault().asyncExec(new Runnable() {
       public void run() {
           List<MyObject> objects = model.getViewData();
           for(MyObject object: objects){
           TableItem item = new TableItem(table, SWT.NULL);
           item.setImage(0, img1);
           item.setBackground(color1);
               item.setText(0, object.getProperty0());
               item.setText(1, object.getProperty1());
               item.setText(2, object.getProperty2());
               ..... 
            }
       });

20k enregistrements de dessin sur mon ordinateur prend environ 20 secondes. Le plus gros problème de performance que j'ai vu dans Windows sont causés par quantité incroyable de messages de fenêtrage natifs envoyés par SWT lorsque nouvel élément de table créé et rempli avec le texte. J'ai trouvé une grande solution pour cela - cacher table avant remplissage, puis le montrer lorsque vous avez terminé. Juste appeler table.setVisible (false) avant que la boucle et table.setVisible (true) après la boucle fait des merveilles - la vitesse monte six-sept fois!

Je voudrais accélérer encore plus. Que suggérerais-tu ? Je me demande aussi comment cette astuce cacher le widget travaillerait sur les implémentations non-fenêtres de SWT (aka Linux)?

Était-ce utile?

La solution

SWT peut le faire pour vous. Lorsque vous utilisez le drapeau de style SWT.VIRTUAL, les éléments ne sont créés lorsque trouve dans la vue. Voici comment faire:

  1. Créez la table avec un style SWT.VIRTUAL
  2. Définir le nombre de lignes en utilisant le tableau # setItemCount ()
  3. Ajouter un Listener SWT.SetData qui remplit les TableItems sur demande.

Voici un extrait de code:

public static void main( String[] args ) {
    Display display = new Display();
    Shell shell = new Shell( display );
    shell.setLayout( new FillLayout() );
    final Table table = new Table( shell, SWT.VIRTUAL );
    table.setItemCount( 10000 );
    table.addListener( SWT.SetData, new Listener() {
        public void handleEvent( Event event ) {
            TableItem item = (TableItem)event.item;
            item.setText( "Item " + table.indexOf( item ) );
        }
    } );
    shell.setSize( 300, 500 );
    shell.open();
    while( !shell.isDisposed() ) {
        if( !display.readAndDispatch() ) {
            display.sleep();
        }
    }
    display.dispose();
}

Autres conseils

Vous voulez faire de chargement paresseux sur l'écran du tableau. Fondamentalement, vous gardez tous ces objets hors-champ dans la mémoire, puis créez seulement une poignée de lignes de table GUI réelle. Comme l'utilisateur fait défiler vous réengendrer ces lignes avec les objets à cet endroit de défilement.

Voir cet article ( EDIT: oups je voulais dire cet article ) pour un exemple de JFace.

1 -. En utilisant ce setText (String []) au lieu de setText (int, String) un appel au lieu de plusieurs

2 - utiliser myTable.setRedraw (false) avant et myTable.setRedraw (vrai) après le processus pour arrêter toutes les opérations redessine lors du chargement de données

.

il est plus simple et peut améliorer les performances !!

bonne chance.

de mon côté en utilisant ce que je charge 2500 lignes de 20 colonnes en moins de 300 ms ..... sur un PC standard aujourd'hui.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top