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

  1. #1
    Membre habitué 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
    Points : 193
    Points
    193
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    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 habitué 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
    Points : 193
    Points
    193
    Par défaut
    Super merci je vais déjà regarder la contentprovider
    Merci

  4. #4
    Membre habitué 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
    Points : 193
    Points
    193
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    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.

  7. #7
    Membre habitué 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
    Points : 193
    Points
    193
    Par défaut
    OUAH ça c'est sympa !
    Je vais regarder tout ça de prêt, je te dirais !

    Sinon j'avais fouillé la piste du slider en dehors de ma table avec des marqueurs:
    http://www.developpez.net/forums/d13...e/#post7732979
    https://today.java.net/pub/a/today/2...component.html

    Reste plus qu'à tester tout ça et voir le mieux !

    en tout cas un grand merci à toi, je te tiens au courant

  8. #8
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Salut,

    Jolie POC Joel.
    Par contre, je pense que la réalisation risque d'être un poil complexe.
    Dans le même "style" que les marques Eclipse, pourquoi tu n'accoles pas tout simplement un Canvas à ton TableViewer?
    Nom : marque.png
Affichages : 296
Taille : 9,6 Ko
    Dans ce cas là, t'as le TableViewer en noir, le Scroll en rouge et le Canvas en vert dans lequel tu insères des rectangles représentant les marques.
    Tu fais une règle de 3 pour avoir la position et c'est gagné.
    Après, il va te falloir gérer le survol des éléments ainsi que l'action lié au clic... Mais bon, une fois que tu as la position dans le Canvas, ça reste la "même" règle de 3 inversé.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  9. #9
    Membre habitué 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
    Points : 193
    Points
    193
    Par défaut
    Salut Gueritarish !

    C'est un peu dans ce sens que j'orientais mes recherches sur le slider ... pour pourquoi par un canvas !
    Merci à tous les 2

  10. #10
    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 : 54
    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
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Oui, @Guetarish, c'était ça l'idée "d'alternative" dans mon second post. D'un autre côté, je me dis que si on sait le faire dans un Canvas, et qu'on sait afficher un Canvas en surimpression du TableViewer, on est pas loin de ce que cherche à faire @kkt8. Certes, la gestion des évènements souris peut être un peu complexe.
    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.

  11. #11
    Membre habitué 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
    Points : 193
    Points
    193
    Par défaut
    Oui j'ai un peu peur que l'utilisateur se mélange les pinceaux entre cliquer sur le marqueur et cliquer sur le scroll ... la gestion va être compliquée.
    Je vais regarder ce que ça donne mais l'option du canvas à l'extérieur (à gauche du tableViewer pour ma part) sera peut-être moins compliquée et les 2 fonctions seront bien séparées et donc plus facilement identifiables.

  12. #12
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Le mieux serait, du coup, de créer un "composant" qui s'occuperait de toute cette logique avec aussi l'objet métier sélectionné pour faciliter la gestion du scroll.
    Ex: l'utilisateur fait une marque en haut du tableau, scrolle jusqu'en bas et clique sur la marque. Là, il te faut faire remonter le scroll et sélectionné l'élément "marqué".
    Avec l'objet métier, ça se fait en 1 opération:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myViewer.setSelection(new StructuredSelection(myObject), true);
    Et tu évites le positionnement du scroll un peu "douteux" à la mano.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  13. #13
    Membre habitué 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
    Points : 193
    Points
    193
    Par défaut
    ILazyContentProvider implémenté ! tellement simple que j'ai douté pendant un moment que les données étaient bien chargées à la volée .. et oui
    un grand merci !

    Je ferais le slider un peu plus tard, je reviendrais peut-être vous embêter !
    a+

+ 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