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

Agents de placement/Fenêtres Java Discussion :

JScrollPane et AffineTransform / zoom


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Par défaut JScrollPane et AffineTransform / zoom
    Bonjour à tous,

    J'ai une classe dérivée de JComponent qui dessine dans son espace client des formes géométriques simples en utilisant les méthodes fill() et draw() de Graphics2D sur des classes implémentant java.awt.Shape (des rectangles et des polygones) dans sa méthode paintComponent().

    Quand je mets ce composant dans un JScrollPane, tout marche parfaitement sans que j'ai eu à implémenter Scrollable. Je suis parfaitement statisfait du comportement à ce niveau là.

    Par la suite, j'ai voulu ajouter une fonctionnalité de zoom. J'ai donc pensé à utiliser la classe AffineTransform et sa méthode scale().

    J'ai naïvement ajouté un appel à Graphics2D.setTranform() dans la méthode paintComponent() de ma classe comme ceci :

    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
    @Override
    protected void paintComponent(Graphics g) {
    	super.paintComponent(g);
    		
    	Graphics2D g2d = (Graphics2D)g;
    	g2d.setTransform(affineTransform);
    	
    	// Dessin du fond du composant
    	g2d.setColor(Color.WHITE);
    	g2d.fillRect(0, 0, getWidth(), getHeight());
    	g2d.setColor(Color.BLACK);
    	
    	// dessin des formes géométriques à l'intérieur
    	// NB : la classe CanvasItem encapsule une shape avec 
    	// quelques infos supplémentaires.
    	for (CanvasItem item : canvas.getItems()) {
    		item.paint(g2d);
    	}
    }
    Dès lors le dessin est bien zoomé par le facteur choisi, mais j'ai des problèmes :

    1. Apparement, les scrollbars sont calculées d'après la taille du composant avant le zoom.

    2. Le défilement ne se fait plus lorsque je déplace mes scrollbars.

    Je m'y prends donc visiblement de travers. Quelqu'un pourrait-il m'indiquer comment m'y prendre ?

    Bien à vous,

    Niark13.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Le JScrollPane utilise la "preferredSize" du composant pour l'afficher dans sa taille optimale

    Il faudrait que tu redéfinisses cette méthode pour calculer la taille du composant, et que tu prennes en compte l'affineTransform dans ce calcul

    a++

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Par défaut
    Merci adiGuba de ta réponse. J'ai redéfini getPreferredSize() et ça a réglé mon premier problème. Les scrollbars sont bien calculées en fonction du niveau de zoom maintenant.

    Par contre, ça ne défile toujours pas lorsque je déplace mes scrollbars.

    voici ma méthode getPreferredSize() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Override
    public Dimension getPreferredSize() {
    	Dimension d = super.getPreferredSize();
    	return new Dimension((int)(d.width * zoomFactor), (int)(d.height * zoomFactor));
    }
    Une idée ?

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Le problème vient du setTransform().
    Apparemment le JScrollPane utilise une transformation de translation pour dessiner la bonne section du composant à l'écran.


    Mais comme tu remplaces carrément l'AffineTransform tu "perds" cette notion de translation


    La solution est toute bête et consiste à concaténer les translations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	// On concatene les transformations :
    	AffineTransform transform = g2d.getTransform();
    	transform.concatenate(affineTransform);
    	g2d.setTransform(transform);
    a++

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Par défaut
    MILLE MERCIS ADIGUBA !

    Ça fonctionne très bien maintenant !

    Quelle réactivité !

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

Discussions similaires

  1. [JScrollPane] Pan et Zoom
    Par buenol dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 26/11/2009, 18h02
  2. Zoom puis translation avec AffineTransform
    Par mm2405 dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 04/06/2007, 14h50
  3. zoom - effets sur JScrollPane et sur BufferedImage
    Par Ichigo-BaKa dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 14/05/2007, 22h37
  4. Réponses: 2
    Dernier message: 03/03/2007, 20h16
  5. [JScrollPane] Zoom et redimensionnement du JScrollPane
    Par Bideul dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 30/06/2005, 17h42

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