IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SWT/JFace Java Discussion :

Ascenseur dans un TableViewer


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Par défaut Ascenseur dans un TableViewer
    Bonjour,

    J'ai enormément de données et c'est très long à charger.
    Je ne voudrais "charger" dans mon tableau que celles que l'on voit MAIS avoir un ascenseur qui represente la totalité des données ET en plus (oui il y a plus...) pouvoir mettre dans cet ascenseur des marqueurs afin de pouvoir retourner rapidement à une donnée que j'aurais repérée.

    Est-ce possible ?
    Une idée de comment faire ça ?

    D'avance merci
    Chris

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu peux faire ça en faisant un contentprovider qui implémente ILazyContentProvider : le TableViewer doit être créé avec le style SWT.VIRTUAL, et le nombre d'éléments total est renseigné par la méthode setItemCount.

    Par contre, pour les marqueurs, je ne vois pas de solution possible immédiate. Je vais réfléchir à la question.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Par défaut
    Super merci je vais déjà regarder la contentprovider
    Merci

  4. #4
    Membre éclairé Avatar de kkt8
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    472
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 472
    Par défaut
    Eventuellement, je pourrais mettre à l'exterieur de mon tableViewer (au dessus par ex) une sorte de timeline avec un curseur (slider) qui me permettrait de me balader dans mon tableviewer (et donc repositionnerais mon ascenseur aussi) et sur lequel je pourrais mettre des marqueurs ...
    Mais comment faire un truc pareil ?

  5. #5
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Il n'est pas évident de dessiner par dessus les scrollbars d'un Table : leur rendu est délégué à l'OS, et, en conséquence, pas d'évènement Paint. On peut dessiner par dessus le Table, mais les scrollbars sont toujours affichées par dessus et donc masquent ce qu'on dessiner par dessus le Table. On ne peut pas mettre le Table dans un conteneur (Composite) et dessiner par dessus le composite : ça dessinerait de toute manière en dessous de la Table. La seule solution que j'entrevois pour le moment et de ne pas afficher l'ascenseur, d'ajouter un Slider pour gérer ton propre ascenseur (beaucoup de boulot pour que ça soit clean), et dessiner par dessus le Scale. On peut alors théoriquement redessiner par dessus : malheureusement, je viens de faire un petit essai, et je vois bien mon dessin par dessus, mais il est remplacé ensuite par le dessin de l'ascenseur (avec un joli effet de fade certes) dès que je bouge la souris. Du coup, ça ne fonctionne pas en pratique. On peut contourner un cas : lors de la manipulation de l'ascenseur on peut forcer le redraw mais çà commence à faire bidouille, et ça introduit un petit effet de clignotement. Reste la solution de faire ton propre ascenseur avec un Canvas. Pas mal de boulot en perspective, et je ne parle pas d'avoir un rendu qui ne dénote pas trop par rapport à l'environnement graphique (et pour toutes les plateformes).

    Maintenant, il y a une alternative : celle d'ailleurs qui est utilisé par Eclipse IDE. Dans ton éditeur, tu peux voir à droite un composant avec des marques, qui correspondent, en quelque sorte à ce que tu cherches à faire. Ceci est géré par un composant JFace, IVerticalRuler (plusieurs implémentations fournies), dont tu pourrais t'inspirer éventuellement (l'utiliser n'est pas évident parce qu'il est lié à la notion d'éditeur de texte), bien que pour ma part, je partirais de zéro, parce que dans le principe, ce n'est pas très difficile de faire ce type de composant avec un Canvas, alors, inutile de perdre du temps à comprendre le fonctionnement d'un autre composant pour l'adapter.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Bon, j'ai réussi à le faire en utilisant une autre approche : faire mon propre layout et utiliser un canvas transparent.

    Je t'ai fais un POC, mais il reste pas mal de travail : il va falloir que tu détermines les positions de tes marques en fonction de la taille de la scrollbar et du nombre d'éléments, puis gérer leur dessin. Et probablement retravailler un peu le layout que j'ai fait pour mettre en place un cache.

    Dans ce POC, je montre qu'on peut redessiner au dessus du scrollbar :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    public class TestTable {
     
    	public static void main(String[] args) {
     
    		Display display = new Display();
     
    		Shell shell = new Shell(display);
     
    		shell.setLayout(new FillLayout());
     
    		final Composite composite = new Composite(shell,SWT.NONE);
    		composite.setEnabled(true);
    		composite.setLayout(new Layout() {
     
    			// vite fait pour le POC : à améliorer, en particulier sur la gestion du cache
     
    			@Override
    			protected void layout(Composite composite, boolean flushCache) {
    				Point size = computeSize(composite, SWT.DEFAULT, SWT.DEFAULT, flushCache);
    				composite.getChildren()[0].setBounds(0, 0, size.x, size.y);
    				composite.getChildren()[1].setBounds(0, 0, size.x, size.y);
    			}
     
    			@Override
    			protected Point computeSize(Composite composite, int wHint, int hHint,
    					boolean flushCache) {
    					Rectangle area = composite.getClientArea();
    					int width = area.width;
    					int height = area.height;
    					if ( wHint!=SWT.DEFAULT ) {
    						width = wHint;
    					}
    					if ( hHint!=SWT.DEFAULT ) {
    						height = hHint;
    					}
    				return new Point(width, height);
    			}
    		});
     
    		final Canvas canvas = new Canvas(composite, SWT.TRANSPARENT); 
     
    		final Table table = new Table(composite, SWT.V_SCROLL);
    		for (int i = 0; i < 5; i++) {
    			TableColumn column = new TableColumn(table, SWT.NONE);
    			column.setText("Column "+i);
    			column.setWidth(200);
    		}
    		// Create rows
    		for (int i = 0; i < 50; i++) {
    			TableItem item = new TableItem(table, SWT.NONE);
    			for (int j = 0; j < 5; j++) {
    				item.setText(j, "Item "+i+" value "+j);
    			}
    		} 
     
    		canvas.addPaintListener(new PaintListener() {
     
    			@Override
    			public void paintControl(PaintEvent e) {
    				Point barSize = table.getVerticalBar().getSize();
    				Rectangle tableBounds = table.getBounds();
    				e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_RED));
    				e.gc.setAlpha(128);
    				e.gc.fillRectangle(tableBounds.width-barSize.x, 0, barSize.x, barSize.y);
    				// le thumb
    				Rectangle thumbBounds = table.getVerticalBar().getThumbBounds();
    				e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_GREEN));
    				e.gc.fillRectangle(thumbBounds.x, thumbBounds.y, thumbBounds.width, thumbBounds.height);
     
    				// les boutons, en supposont qu'on puisse determiner leur taille en faisant la différence entre le bar et le track
    				Rectangle trackBounds = table.getVerticalBar().getThumbBounds();
     
    				Point buttonSize = new Point(trackBounds.y, barSize.x);
     
    				e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_CYAN));
    				e.gc.fillRectangle(tableBounds.width-barSize.x, 0, buttonSize.x, buttonSize.y);
    				e.gc.fillRectangle(tableBounds.width-barSize.x,  barSize.y - buttonSize.y, buttonSize.x, buttonSize.y);
     
    			}
    		}); 
    		canvas.setEnabled(false);
     
    		shell.setVisible(true);
     
    		shell.setSize(600, 400);
    		shell.open ();
    		while (!shell.isDisposed ()) {
    			if (!display.readAndDispatch ()) display.sleep ();
    		}
     
     
    		display.dispose();
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD11]Ascenseur dans une fenêtre interne
    Par kuranes dans le forum WinDev
    Réponses: 4
    Dernier message: 24/05/2007, 18h43
  2. Réponses: 2
    Dernier message: 14/12/2006, 19h11
  3. [TP] Créer un ascenseur dans une page ?
    Par vladimire dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 11/12/2006, 16h45
  4. [Struts layout] comment faire un ascenseur dans un tableau
    Par chouchou93 dans le forum Struts 1
    Réponses: 4
    Dernier message: 21/02/2006, 09h08
  5. ascenseur dans une listbox ....
    Par hijodelanoche dans le forum Composants VCL
    Réponses: 2
    Dernier message: 27/11/2005, 16h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo