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 :

[débutant]Scroll dans un Canvas


Sujet :

SWT/JFace Java

  1. #1
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut [débutant]Scroll dans un Canvas
    Bonjour,

    J'ai une classe qui hérite de Canvas.
    Lors de la création de ce canvas, j'ai fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //Création du Canvas
    		DrawingCanvas drawingCanvas = new DrawingCanvas(parent, SWT.BORDER | SWT.V_SCROLL
    				| SWT.H_SCROLL , controller);
    Mon canvas a bien les deux scrollBars mais lorsque je les fais bouger, rien ne se passe. Le dessin à l'intérieur du Canvas reste immobile

    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
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
     
    public class DrawingCanvas extends Canvas {
     
    	/*
    	 * Le contrôleur du canvas
    	 */
    	private DrawingController 	controller;
    	/*
    	 * La fiche de manoeuvre
    	 */
    	private SheetOfManoeuvre 	sheetOfManoeuvre;
    	/*
    	 * La marge autour du schéma
    	 */
    	private static final float 	MARGIN = 40;
    	/*
    	 * L'échelle utilisé pour ce schéma
    	 */
    	private float              	scale = 1f;
    	/*
    	 * Les curseurs
    	 */
    	private Cursor 				arrowCursor;
    	private Cursor 				crossCursor;
    	/*
    	 * Le rectangle de selection
    	 */
    	private Path               rectangleFeedback;
     
    	private Rectangle2D        planBoundsCache;
     
     
     
    	public DrawingCanvas(Composite parent, int style, DrawingController controller) {
    		super(parent, style);		
    		this.controller = controller;
    		this.sheetOfManoeuvre = controller.getSheetOfManoeuvre();
    		//initialisation des curseurs
    		arrowCursor = new Cursor(this.getDisplay(), SWT.CURSOR_ARROW);
    	    crossCursor = new Cursor(this.getDisplay(), SWT.CURSOR_CROSS);
    		//ajoute des listeners sur la souris
    		addMouseListeners();
    		//ajoute des listeners sur les touches clavier
    		addKeyListener();
    		//ajoute un listener sur le focus
    		addFocusListener();
    		//ajoute des listeners sur le modèle
    		addModelListener();
    		//ajoute des listeners sur le dessin
    		addCanvasListener();
    	}
     
    	public DrawingCanvas getDrawingCanvas(){
    		return this;
    	}
     
    	/**
             * Ajoute un listener sur la souris
             */
    	private void addMouseListeners() {
    	}
     
    	  /**
               * Ajoute un listener sur les touches du clavier  
               */
    	  private void addKeyListener() {
    	}
     
    	/**
             * Ajoute un listener sur le focus
             */
    	private void addFocusListener() {
    	}
     
    	/**
             * Ajoute un listener pour recevoir les notifications
             * de la fiche de manoeuvre 
             */
    	private void addModelListener() {
    		//ajoute un listener qui écoute les modifications sur les traits
    		sheetOfManoeuvre.getDrawing().addLineListener(new LineListener() {
    			public void lineChanged(LineEvent ev) {
    				if (getParent() instanceof ScrolledComposite) {
    			          ((ScrolledComposite)getParent()).setMinSize(
    			              computeSize(SWT.DEFAULT, SWT.DEFAULT));
    			        }
    				redraw();
    			}
    		});
    		//ajoute un listener qui écoute les selections
    		sheetOfManoeuvre.getDrawing().addSelectionListener(new SelectionListener() {
    			public void selectionChanged(SelectionEvent ev) {
    				redraw();
    			}
    		});		
    	}
     
    	/**
             * Ajoute un listener pour recevoir les notifications
             * de la fiche de manoeuvre 
             */
    	private void addCanvasListener() {
    		//ajoute un listener qui écoute les modifications sur le dessin
    		this.addPaintListener(new PaintListener() {
    			public void paintControl(PaintEvent event) {					
    				DrawingCanvas.this.paintControl(event.gc);
    			}
    		});
    	    this.addDisposeListener(new DisposeListener () {
    	        public void widgetDisposed(DisposeEvent e) {
    	          if (rectangleFeedback != null) {
    	            rectangleFeedback.dispose();
    	          }
    	          arrowCursor.dispose();
    	          crossCursor.dispose();
    	        }
    	      });
    	}
     
     
     
    	/**
             * Dessine le canvas
             */
    	private void paintControl(GC gc) {
    		paintBackground(gc);
    		gc.setAntialias(SWT.ON);
    		// dessine les composants
    		paintLines(gc);
    		paintRectangleFeedback(gc);
     
    	}
     
    	/**
             * Remplit le fond avec la couleur du systeme
             */
    	private void paintBackground(GC gc) {
    		gc.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
    		gc.fillRectangle(0, 0, this.getSize().x,
    				this.getSize().y);
    	}
     
    	/**
             * Renvoie le rectangle englobant le schéma affiché par ce composant
             */
    	private Rectangle2D getPlanBounds() {
    		if (this.planBoundsCache == null) {
    			this.planBoundsCache = new Rectangle2D.Float(0, 0, 1000, 1000);
    			for (Line line : sheetOfManoeuvre.getDrawing().getLines()) {
    				this.planBoundsCache.add(line.getXStart(), line.getYStart());
    				this.planBoundsCache.add(line.getXEnd(), line.getYEnd());
    			}
    		}
    		return this.planBoundsCache;
    	}
     
    	/**
             * Dessine le rectangle de selection
             */
    	private void paintRectangleFeedback(GC gc) {
     
    	}
     
    	/**
             * Dessine les traits
             */
    	private void paintLines(GC gc) {
    		//Dessine les traits selectionnés en les surlignants
    		List<Object> selectedItems = this.sheetOfManoeuvre.getDrawing().getSelectedItems();
    		if (!selectedItems.isEmpty()) {
    			gc.setForeground(this.getDisplay().getSystemColor(
    					SWT.COLOR_LIST_SELECTION));
    			gc.setAlpha(128);
    			gc.setLineWidth((int) Math.round(6 / this.scale));
    			gc.setLineJoin(SWT.JOIN_ROUND);
    			for (Object item : selectedItems) {
    				if (item instanceof Line) {
    					Line line = (Line)item;
    						gc.drawLine(Math.round(line.getXStart()), Math.round(line
    							.getYStart()), Math.round(line.getXEnd()), Math
    							.round(line.getYEnd()));
    				}
    			}
    		}
    		// Dessine les traits
    		gc.setForeground(this.getDisplay().getSystemColor(
    				SWT.COLOR_LIST_FOREGROUND));
    		gc.setAlpha(255);
    		gc.setLineWidth((int) Math.round(2 / this.scale));
    		gc.setLineJoin(SWT.JOIN_MITER);		
    		for (Line line : this.sheetOfManoeuvre.getDrawing().getLines()) {
    			gc.drawLine(Math.round(line.getXStart()), Math.round(line
    					.getYStart()), Math.round(line.getXEnd()), Math.round(line
    					.getYEnd()));
    		}
    	}
     
    	/**
             * Returns the scale used to display the plan.
             */
    	public float getScale() {
    		return this.scale;
    	}
    }
    Mon application dessine pour le moment des lignes.
    1) Après avoir dessiné une ligne au centre du canvas, je bouge un des scroll et la ligne reste immobile

    2) J'aimerai créer un méthode qui met à jour l'affichage lorsqu'une nouvelle ligne est crée et que celle-ci dépasse les limites visible de l'écran.
    Je sais faire appel à cette méthode lors de la création de mes lignes mais je ne sais pas comment savoir si mon dessin dépasse les limites visibles.

    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
     
    	/**
             * S'assure que le point au (<code>xPixel</code>, <code>yPixel</code>) est
             * est visible et bouge le scrollbars si besoin
             */
    	public void makePointVisible(float x, float y) {
    		if (this.getParent() instanceof ScrolledComposite) {
    			Rectangle pixelBounds ;
    //C'est ici que je ne sais plus quoi faire
    			ScrolledComposite parent = (ScrolledComposite) this.getParent();
    			Point origin = parent.getOrigin();
    			if (origin.x > pixelBounds.x || origin.y > pixelBounds.y) {
    				parent.setOrigin(pixelBounds.x, pixelBounds.y);
    			}
    		}
    	}
    Merci pour votre aides/vos conseils

  2. #2
    Membre averti

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Points : 305
    Points
    305
    Par défaut
    Bonjour,

    Je t'invite à regarder l'exemple suivant :
    http://dev.eclipse.org/viewcvs/index...8.java?view=co

    Qui consiste à faire défiler une image dans un canvas.

    Si ca ne t'inspire pas, peux-tu poster le code source complet de ton programme, que je regarde ?

    Laurent

  3. #3
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Ok merci laurent

    J'accepte volontié que tu regardes...
    Avec l'exemple, j'arrive à comprendre qu'il faut un listener sur le scroll. C'est déjà un bon début mais je ne vois pas comment adapter cela à appli de dessin.
    Les sources sont un peu volumineuse... je t'envoie la totalité pour voir le fonctionnement ? ou je poste mon code ici ? soit 7 classes

    d'avance merci

  4. #4
    Membre averti

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Points : 305
    Points
    305
    Par défaut
    Salut,

    Tu peux m'envoyer le code en MP s'il te plait ? Je regarde cela demain matin,

    Laurent

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Points : 305
    Points
    305
    Par défaut
    Bonjour,

    Voici une solution :

    Dans la méthode addCanvasListener j'ai ajouté un listener qui s'occupe d'initialiser les scrollbars :

    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
     
            this.addListener(SWT.Resize, new Listener() {
     
                @Override
                public void handleEvent(Event event) {
                    // Initialisation de la taille de la scrollbar
                    ScrollBar sbh = DrawingCanvas.this.getHorizontalBar();
                    sbh.setMinimum(0);
                    sbh.setMaximum((int) getPlanBounds().getWidth());
                    sbh.setSelection(0);
                    sbh.setThumb(getSize().x);
     
                    ScrollBar sbv = DrawingCanvas.this.getVerticalBar();
                    sbv.setMinimum(0);
                    sbv.setMaximum((int) getPlanBounds().getWidth());
                    sbv.setSelection(0);
                    sbv.setThumb(getSize().y);                
                }});
    Ensuite quand on clique sur la scrollbar, j'ajoute un listener pour forcer à redessiner l'ensemble:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
            final ScrollBar hBar = getHorizontalBar ();
            hBar.addListener (SWT.Selection, new Listener () {
                public void handleEvent (Event e) {
                    redraw();
                }
            });
            final ScrollBar vBar = getVerticalBar ();
            vBar.addListener (SWT.Selection, new Listener () {
                public void handleEvent (Event e) {
                    redraw();
                }
            });
    Enfin dans la méthode paintLines(GC) je décale le dessin en fonction de la sélection dans les scrollbars :

    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
     
     
        private void paintLines(GC gc) {
            //Dessine les traits selectionnés en les surlignants
            List<Object> selectedItems = this.sheetOfManoeuvre.getDrawing().getSelectedItems();
            // Décalage
            int decalageX = getHorizontalBar().getSelection();
            int decalageY = getVerticalBar().getSelection();
     
            if (!selectedItems.isEmpty()) {
                gc.setForeground(this.getDisplay().getSystemColor(
                        SWT.COLOR_LIST_SELECTION));
                gc.setAlpha(128);
                gc.setLineWidth((int) Math.round(6 / this.scale));
                gc.setLineJoin(SWT.JOIN_ROUND);
                for (Object item : selectedItems) {
                    if (item instanceof Line) {
                        Line line = (Line)item;
                            gc.drawLine(Math.round(line.getXStart())-decalageX, Math.round(line
                                .getYStart())-decalageY, Math.round(line.getXEnd())-decalageX, Math
                                .round(line.getYEnd())-decalageY);
                    }
                }
            }
            // Dessine les traits
            gc.setForeground(this.getDisplay().getSystemColor(
                    SWT.COLOR_LIST_FOREGROUND));
            gc.setAlpha(255);
            gc.setLineWidth((int) Math.round(2 / this.scale));
            gc.setLineJoin(SWT.JOIN_MITER);
     
            for (Line line : this.sheetOfManoeuvre.getDrawing().getLines()) {
                gc.drawLine(Math.round(line.getXStart())-decalageX, Math.round(line
                        .getYStart())-decalageY, Math.round(line.getXEnd())-decalageX, Math.round(line
                        .getYEnd())-decalageY);
            }
            // Fin Laurent        
        }
    Bien sûr il faudrait optimiser pour ne pas dessiner les lignes invisibles, mais je te laisse bosser un peu

    Laurent

  6. #6
    Membre averti

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Points : 305
    Points
    305
    Par défaut
    Deuxième point : le clignotement

    Pour éviter cela, on va utiliser le double buffering.
    C'est une méthode qui consiste à utiliser deux tampons :
    un dédié à l'affichage, l'autre au dessin.

    D'abord, on déclare le Canvas en style NO_BACKGROUND :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public DrawingCanvas(Composite parent, int style, DrawingController controller) {
            super(parent, style | SWT.NO_BACKGROUND );
            ...
        }
    Ensuite on modifie paintControl : l'idée est qu'on dessine sur un nouveau GC, et quand on a fini on "colle" ce GC sur celui du canvas :

    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
     
        private void paintControl(GC gc) {
     
            Image image = (Image) getData("double-buffer-image");
            if (image == null || image.getBounds().width != getSize().x || image.getBounds().height != getSize().y) {
              image = new Image(getDisplay(),getSize().x,getSize().y);
              setData("double-buffer-image", image);
            }
            GC imageGC = new GC(image);
     
            paintBackground(imageGC);
            imageGC.setAntialias(SWT.ON);
            paintLines(imageGC);
            paintRectangleFeedback(imageGC);
            gc.drawImage(image, 0, 0);
            imageGC.dispose();
        }
    Et ca ne clignote plus

    Laurent

  7. #7
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Hello,
    Déjà merci beaucoup !
    "Ça marche capitaine, ça marche !! "

    Pour l'histoire du double-Buffering, c'est une notion que je ne connaissais pas
    Maintenant c'est enregistré !
    Petit bout de code simple mais efficace ! Parfait !

    Bien sûr il faudrait optimiser pour ne pas dessiner les lignes invisibles, mais je te laisse bosser un peu
    Je ne vois pas de lignes invisibles
    Mon seul problème c'est toujours ma méthode setSelectionVisible() et setPointVisible() qui permettent de déplacer les scrolls lorsque la ligne se dessine/déplace hors du cadre... Je pense que ma méthode getPlanBounds() ne contient pas les coordonnées extrêmes de toutes mes lignes
    La méthode getPlanBounds() doit englober toute les lignes dessinées sur le Canvas


    Merci beaucoup pour ton aides et conseils avisés

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Points : 305
    Points
    305
    Par défaut
    De rien,

    N'oublie pas de mettre le post en résolu si ca marche

    A+

    Laurent

  9. #9
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    si je n'abuse pas, peux tu regarder et me conseiller sur mes problemes de méthodes getPlanBoumds et setPointVisible. (ci-dessus)

    Merci
    Vince

  10. #10
    Membre averti

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Points : 305
    Points
    305
    Par défaut
    Salut,

    Tel que je vois les choses :
    - getPlanBound() doit contenir la taille totale du dessin (par défaut 1000*1000)
    - setSelectionVisible() doit rendre visible ... la sélection.
    Pour ce point je ferais comme cela :
    - Tu connais le décalage en X et Y de ton dessin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int decalageX = getHorizontalBar().getSelection();
    int decalageY = getVerticalBar().getSelection();
    Sachant que getSize() te donne la taille de ton canvas, alors les objets de ton dessins sont compris dans les intervalles :
    decalageX <= Xobjet <= getSize().x+decalageX
    decalageY <= Yobjet <= getSize().y+decalageY

    Là, tu sais si l'objet est visible... Et si ce n'est pas le cas, il te suffit de calculer le décalage et de l'application à ta scollbar : getHorizontalBar().setSelection(newDecalage).

    J'espère t'avoir aidé,

    Laurent

  11. #11
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Hello,
    Oui tu m'as bien aidé

    J'ai modifié ma méthode getPlanBounds
    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
     
    	/**
             * Renvoie le rectangle englobant le schéma affiché par ce composant
             */
    	private Rectangle2D getPlanBounds() {
    		//Initialise le rectangle englobant le schéma s'il est null
    		if (this.planBoundsCache == null) {
    			this.planBoundsCache = new Rectangle2D.Float(0, 0, 1000, 1000);		
    		}
    		if(!this.planBoundsCacheValid){
    			//Agrandissement du rectangle englobant les différents items
    			Rectangle2D itemsBounds = getItemsBounds();
    	          if (itemsBounds != null) {
    	            this.planBoundsCache.add(itemsBounds);
    	          }
    	          this.planBoundsCacheValid = true;
    		}
    		//Renvoi de la valeur en cache
    		return this.planBoundsCache;
    	}
     
     
    	/**
             * Renvoie dimmensions des différents items déssiné dans le Canvas (Trait,
             * arc, cercle, équipements)
             */
    	private Rectangle2D getItemsBounds() {
    		Rectangle2D itemsBounds = null;
    		// Agrandissement du rectangle englobant les extrémités des traits
    		for (Line line : sheetOfManoeuvre.getDrawing().getLines()) {
    			if (itemsBounds == null) {
    				itemsBounds = new Rectangle2D.Float(line.getXStart(), line
    						.getYStart(), 0, 0);
    				itemsBounds.add(line.getXEnd(), line.getYEnd());
    			} else {
    				itemsBounds.add(line.getXStart(), line.getYStart());
    				itemsBounds.add(line.getXEnd(), line.getYEnd());
    			}
    		}
    		return itemsBounds;
    	}
    et j'ai modifié pour l'instant ma méthode
    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
     
    	/**
             * S'assure que le point au (<code>xPixel</code>, <code>yPixel</code>) est
             * est visible et bouge le scrollbars si besoin
             */
    	public void makePointVisible(float x, float y) {
    		int decalageX = getHorizontalBar().getSelection();
    		int decalageY = getVerticalBar().getSelection();
    		if( decalageX < x && x < getSize().x- decalageX){
    			getHorizontalBar().setSelection((int)x);
    		}else if(decalageY < y && y < getSize().y- decalageY){
    			getVerticalBar().setSelection((int)y);
    		}
    		//scroll((int)x, (int)y, 100, 100, 1/(int)getScale(), 1/(int)getScale(), false);
    	}
    Mes scrolls bougent bien mais de façon anarchique
    J'ai essayé la méthode scroll() de Canvas mais cela ne fonctionne pas plus

    J'ai pour le moment, j'ai pas modifié ma méthode:
    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
     
    	/**
             * S'assure que les traits selectionné sont visible à l'écran
             * et bouge les scollbars si besoin
             */
    	public void makeSelectionVisible() {
    		List<Object> selectedItems = this.sheetOfManoeuvre.getDrawing().getSelectedItems();
    		if (!selectedItems.isEmpty()) {
    			float minX = Float.MAX_VALUE;
    			float minY = Float.MAX_VALUE;
    			for (Object item : selectedItems) {
    				if (item instanceof Line) {
    					Line line = (Line)item;
    					minX = Math.min(minX, line.getXStart());
    					minY = Math.min(minY, line.getYEnd());
    				}
    			}
    			makePointVisible(minX, minY);
    		}
    	}
    Merci beaucoup pour ton aide

  12. #12
    Membre habitué Avatar de pingoui
    Homme Profil pro
    Activité professionnelle sans liens avec le developpement
    Inscrit en
    Juillet 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Activité professionnelle sans liens avec le developpement
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2004
    Messages : 582
    Points : 185
    Points
    185
    Par défaut
    Merci beaucoup pour ton aide

    Ca marche
    Il fallait simplement mettre un "!" devant les conditions du "if"...


    Eh ! Hop ! un jolie tag Résolu

  13. #13
    Membre averti

    Profil pro
    Inscrit en
    Août 2006
    Messages
    218
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Août 2006
    Messages : 218
    Points : 305
    Points
    305
    Par défaut
    Cool, ca fait plaisir

    Au plaisir de te retrouver sur ce forum !

    Laurent

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

Discussions similaires

  1. Utiliser un scroll dans un canvas
    Par huntox dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 30/10/2013, 11h08
  2. [Débutant] Scrolls dans JTextArea
    Par k-reen dans le forum Composants
    Réponses: 2
    Dernier message: 30/06/2004, 16h14
  3. [Débutant] import dans Eclipse
    Par bonnefr dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 28/05/2004, 10h32
  4. [Débutant] Modifs dans Delphi
    Par J-P-B dans le forum XMLRAD
    Réponses: 6
    Dernier message: 20/06/2003, 15h55
  5. scroll dans un label
    Par Pretender dans le forum Composants VCL
    Réponses: 9
    Dernier message: 27/09/2002, 17h06

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