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

AWT/Swing Java Discussion :

Problème d'affichage d'un JTextPane modifié dans un JScrollPane.


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Par défaut Problème d'affichage d'un JTextPane modifié dans un JScrollPane.
    Bonjour,

    J'ai redéfinie la classe JTextPane pour quelle affiche une image en arriere plan du texte. Tous va bien jusqu'a ce que j'utilise ce JTextPane dans un JScrollPane .... et là ca va plus du tout!!

    Mon image se retrouve décalée ou affiche des bugs graphique lors du scroll.

    Il me semble, (apres maints essais) que le paint() de mon JTextPane s'affectue lorsque j'appuie sur entrée pour revenir à la ligne, puis que le JScrollPane fasse son paint().

    La seule solution que j'ai trouvée jusque là, c'est de redéfinir la classe JScrollPane pour redéfinir la méthode paint() afin que celle-ci redessine la zone visible du JTextPane ....

    Pas terrible tout ca.

    Quelqu'un a t il une solution?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de rems033
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    513
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 513
    Par défaut
    Un bout de code serait le bien venu!

    Je pense que la meilleure solution est de redefinir la methode paintComponent(Graphics g) dans la classe héritant de JTextPane puis d'appeler un repaint() de ta fenetre scroll à chaque scrolling, un truc dans ce genre :
    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
     
            // On ajoute le listener lorsqu'on utilise la barre de defilement verticale
            this.scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener()
            {
                public void adjustmentValueChanged(AdjustmentEvent e)
                {
                    repaint();
                }
            });
     
            // On ajoute le listener lorsqu'on utilise la barre de defilement verticale
            this.scrollPane.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener()
            {
                public void adjustmentValueChanged(AdjustmentEvent e)
                {
                    repaint();
                }
            });
    tien nous au courant !!
    Bon courage

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Par défaut
    Ok je vais tester. Je te tiens au courant

  4. #4
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Par défaut
    Merci rems033, ton idée est la bonne, mon image s'affiche correctement maintenant

    Cependent il subsiste un petit souci : lorsque l'on scrolle, on peut voir le composant se décaler puis se réafficher au bon endroit :s En gros on a un effet "yoyo" pendanr le scroll ;(

    Si vous avez une idée, elle est la bienvenue

    Merci !

    ps voici le code de mes 2 classes :

    Le JScrollPane :

    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
    class JScrollPaneForDecoratedPanel extends JScrollPane
    {
    	Component composant = null;
     
    	public JScrollPaneForDecoratedPanel(Component composant)
    	{
    		super(composant);
    		this.composant = composant;
    		// On ajoute le listener lorsqu'on utilise la barre de defilement verticale
    	    this.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener()
    	    {
    	        public void adjustmentValueChanged(AdjustmentEvent e)
    	        {
    	            repaint();
    	        }
    	    });
     
    	    // On ajoute le listener lorsqu'on utilise la barre de defilement horizontale
    	    this.getHorizontalScrollBar().addAdjustmentListener(new AdjustmentListener()
    	    {
    	        public void adjustmentValueChanged(AdjustmentEvent e)
    	        {
    	            repaint();
    	        }
    	    });
    	}
    }
    et le JTextPane :

    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
    class JDecoratedTextPane extends JTextPane
    {
    	private Image img = null;
    	private Boolean chargé = false;
    	String message = "Chargement en cours";
     
    	public JDecoratedTextPane(String ressource)
    	{
    		super();
    		if(this.getClass().getResource(ressource) != null)
    		{
    			img = getToolkit().getImage(this.getClass().getResource(ressource));
     
    			MediaTracker pisteur = new MediaTracker(this);
     
    			int IMAGE_PRINCIPALE = 0;
     
    			pisteur.addImage(img, IMAGE_PRINCIPALE);
     
    			try
    			{
    				pisteur.waitForID(IMAGE_PRINCIPALE);
    			}
    			catch(InterruptedException e){}
     
    			if(pisteur.isErrorID(IMAGE_PRINCIPALE))
    			{
    				this.setMessage("Erreur");
    			}
    			else
    			{
    				this.chargé();
    			}
    		}		
    	}
     
    	public void chargé()
    	{
    		chargé = true;
    		repaint();
    	}
     
    	public void setMessage(String message)
    	{
    		this.message = message;
    		repaint();
    	}
     
    	public void paintComponent(Graphics g)
    	{
    		if(img != null)
    		{ 
    			Graphics2D g2 = (Graphics2D) g ;
    			super.paintComponent(g2);
    			Rectangle zoneVisible = new Rectangle();
    			zoneVisible = this.getVisibleRect();
    			if(chargé)
    			{				
    				g2.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER,Math.min(0.3f,1.0f)));
    				g2.drawImage(img, zoneVisible.x, zoneVisible.y, zoneVisible.width, zoneVisible.height, this);
    			}
    			else
    			{
    			           FontRenderContext frc = g2.getFontRenderContext(); 
    				int messageWidth = (int)getFont().getStringBounds(message, frc).getWidth();
    				g2.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER,Math.min(0.3f,1.0f))) ;
    				g2.drawRect(0, 0, getSize().width-1, getSize().height-1);
    				g2.drawString(message, (int)((zoneVisible.width - zoneVisible.x)-(0.5*messageWidth)), (zoneVisible.height - zoneVisible.y));
    			}
    			g2.setComposite(java.awt.AlphaComposite.getInstance(java.awt.AlphaComposite.SRC_OVER,1.0f)) ;
    		}
    		else
    		{
    			super.paintComponent(g); 
    		}
    	}
    }

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2007
    Messages : 13
    Par défaut
    Je me permet de réveiller mon ancien topic.

    J'avais trouvé la solution à mon problème mais pas eu le temps de la poster.

    La voici donc: il suffit de mettre le mode de scroll de JViewPort à SIMPLE_SCROLL_MODE.

    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
    public void paintComponent(Graphics g)
        {
            if(getParent() instanceof JViewport && !parentConfigDone)
            {
                ((JViewport)getParent()).setScrollMode(JViewport.SIMPLE_SCROLL_MODE);
                parentConfigDone = true;
            }
            if(img != null)
            { 
                Graphics2D g2 = (Graphics2D) g ;
                super.paintComponent(g2);
                Rectangle zoneVisible = new Rectangle();
                zoneVisible = this.getVisibleRect();
                ...
             }
             ...
        }
    En espérant que ça servira à quelqu'un

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/04/2009, 15h18
  2. problème d'affichage de styles et images dans ma jsp
    Par casho dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 04/03/2009, 18h42
  3. Problème d'affichage d'un swf externe dans la page html
    Par draco62 dans le forum Intégration
    Réponses: 0
    Dernier message: 18/06/2008, 20h19
  4. Réponses: 4
    Dernier message: 21/01/2008, 16h36
  5. Problème avec affichage d'une table modifiée
    Par auriolbeach dans le forum Access
    Réponses: 6
    Dernier message: 31/10/2005, 15h45

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