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 :

Canvas et ScrolledComposite


Sujet :

SWT/JFace Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 28
    Par défaut Canvas et ScrolledComposite
    Bonsoir,

    je suis confronté a un problème que je ne sais résoudre malgré les quelques docs que j'ai pu trouver sur le net.

    De façon simplifié cela consisterait a dessiner des rectangles dans un GC.

    Donc ma démarche est celle-ci:

    - Création d'un ScrolledComposite que je place dans le Shell
    - Création d'un Canvas que je place dans le ScrolledComposite
    - Création d'un Graphical content dans lequel je dessine.

    Je joins un code simplifié, vous pouvez l'executer tout devrait marcher normalement. (Du moins vous verrez a quels problèmes je suis confrontés =)

    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
     
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.custom.ScrolledComposite;
    import org.eclipse.swt.graphics.GC;
    import org.eclipse.swt.graphics.Rectangle;
    import org.eclipse.swt.layout.GridData;
    import org.eclipse.swt.layout.GridLayout;
    import org.eclipse.swt.widgets.Canvas;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Shell;
     
     
    public class Test {
     
     
       public static void main(String[] args) {
          Display myDisplay = new Display();
     
          final Shell myShell = new Shell(myDisplay);
          myShell.setSize(myDisplay.getBounds().width,myDisplay.getBounds().height);
          myShell.setText("Essai Canvas in ScrollComposite");
     
          //Creation GridLayout
          GridLayout gridLayout = new GridLayout();
          gridLayout.numColumns = 2;
          gridLayout.numColumns = 2;
          myShell.setLayout(gridLayout);
     
          //Creation GridData
          GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
          gridData.heightHint = myDisplay.getBounds().height-(myDisplay.getBounds().height)/3;
     
          //Creation ScrolledComposite  dans le shell
          ScrolledComposite scrollPanel = new ScrolledComposite(myShell, SWT.BORDER |
        		  SWT.H_SCROLL); 
          scrollPanel.setLayoutData(gridData);
     
          //Creation canvas  dans le ScrolledComposite
          Canvas canvas = new Canvas(scrollPanel, SWT.NONE);
     
          scrollPanel.setLayoutData(gridData);
          scrollPanel.setContent(canvas);
     
          // Je set la taille du Canvas a une valeur Grande. 
          canvas.setSize(myDisplay.getBounds().width+100000, (myDisplay.getBounds().height-(myDisplay.getBounds().height)/3));
          canvas.setLocation(0,0);
     
     
          myShell.open();
     
        //Creation d'un graphical content  dans le canvas
          GC gc = new GC(canvas);
     
     
          // Je dessine des rectangles...
          for (int i = 0; i < 100000; i++) {
        	  Rectangle rectangle = new Rectangle(i*2+10,50,10,15);
              gc.drawRectangle(rectangle);
          }
     
    // Je pense que la solution a mon problème devrait se situé ci-dessous mais a mon niveau de 
    // connaissance je ne cesse de me casser les dents
    //
    //      scrollPanel.addPaintListener (new PaintListener() {
    //    	    public void paintControl (PaintEvent e) { 	    	
    //			      }
    //    	    }
    //      });
     
          while (!myShell.isDisposed()) {
             if (!myDisplay.readAndDispatch()) myDisplay.sleep();
          }
          myDisplay.dispose(); 
       }
    }
    Au final la scrollBar parait être en phase avec la taille du Canvas mais lorsque j'essaye de me déplacer tout marche bien sauf que ce qui était dessiner sur le Gc disparaît lorsque je reviens sur la position ou celui était dessiné initialement. (J'ai du mal a m'exprimer mais essaye le code, si tu as un peu de temps, tu comprendra mieux)

    D'après mes lecture il faudrait utiliser PaintListener et Paint Event mais les exemples se font rares sur la toile...

    Ainsi si l'un d'entre vous connaît un tutorial ou un site internet (Explicite-car Debutant JAVA) afin que je puisse saisir un peu plus le mode de fonctionnement de ces classes qu'il n'hésite pas a me le faire suivre.

    Merci d'avance et Bonne soirée

  2. #2
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut
    Salut, tu dois ajouter un PaintListener à ton Canvas, ensuite celui-ci doit implémenter la méthode paintControl(PaintEvent). L'objet de type PaintEvent passé en paramètre contient une instance of GC qui te permet de dessiner dans le Canvas (mais tu ne dois pas appeler la méthode dispose() de celui-ci). À chaque fois que ton Canvas va être redimensionné, repositionné ou affiché après avoir été caché il cette méthode sera appellée et il sera redessinné.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 28
    Par défaut
    Une fois de plus Merci !!! , saches que tu m'est d'une aide considérable God Bless You =)

    Une petit question tu maitrises tout cela par la simple lecture de la Javadoc ou toute cette connaissance découle de longues heures d'utilisation de SWT?

    Bonne journée.

  4. #4
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut
    J'ai commencé par une longue lecture des rares (mes plutôt bien fait) cours sur SWT qui sont sur ce site, puis c'est en effet des heures de pratique qui conduisent forcement à une lecture de la javadoc.
    Mais c'est toujours gratifiant de faire partager quand on sent que celui qui pose la question s'investi aussi (je dis ça parce que tu poses des question assez pertinentes dans de long messages donc on se dit que tu saisi un peu le problème et que t'as besoin d'un coup de pouce).

    Ravi de rendre service.

    À bientôt.

  5. #5
    Membre chevronné Avatar de desert
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 414
    Par défaut
    Pour être plus explicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    canvas.addPaintListener(new PaintListener() {
       public void paintControl(PaintEvent e) {
          int nbreRect = canvas.getClientArea().width / 5;
          for (int i = 0; i < nbreRect; i++) {
             Rectangle rectangle = new Rectangle((5*i)+5, 50, 10, 15);
             e.gc.drawRectangle(rectangle);
          }
       }  
    });

  6. #6
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    340
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 340
    Par défaut
    Tu sais en général on évite de donner du code tout fait à moins que se soit nécessaire pour comprendre ou que cela évite de longues explications fastidueuses et difficiles à comprendre car il est plus intéressant et bénéfique de faire le travail soi-même.

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

Discussions similaires

  1. Timage et Canvas??
    Par vanack dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/04/2007, 11h38
  2. Ombres portées sur un canvas
    Par pifou02 dans le forum Langage
    Réponses: 2
    Dernier message: 23/11/2003, 19h03
  3. Comment mettre le curseur d'un Memo sur le Canvas d'une Form ?
    Par julie20 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 27/08/2003, 13h24
  4. [Canvas] Listbox, couleur et multiselect
    Par rbag dans le forum Composants VCL
    Réponses: 3
    Dernier message: 25/09/2002, 13h02
  5. Réponses: 2
    Dernier message: 17/05/2002, 20h37

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