Bonjour !

je suis dans un cas où j'ai une scrollpane de longueur variable (de 800 à 600 000 pixels de large, environ, c'est reconstruit selon le répertoire dans lequel l'utilisateur se situe) et ça me pose quelques soucis.

ma scrollpane est séparée en deux, la viewframe principale et un columnheader

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
scroller.setColumnHeaderView(photoDateRuler);
scroller.setViewportView(photoPanel);
- pour le contenu de la scrollpane, je n'ai absolument aucun problème d'affichage. Il s'agit d'un jpanel sur lequel sont positionnés des jbutton en coordonnées absolu car leur position varie en X et Y, ce n'est pas homogène.

- en revanche j'ai de gros gros artefacts graphiques en ce qui concerne le ColumnHeaderView, qui est un simple JPanel que je redessine avec son paintComponent


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
	public void paintComponent(Graphics g) {
			super.paintComponent(g);
			Rectangle r = g.getClipBounds();
			g.fillRect(r.x,r.y,r.width,r.height);
			g.setColor(new Color(230, 163, 4));
 
			 // dessin d'une scrollbar (le code est pas très clair alors..)
 
        }
j'ai donc des erreurs un peu aléatoires, un coup ça duplique, un coup ça bave, un coup je vois un fond gris, un coup rien... par contre quand je minimise et que je ré-agrandit, ça a bien redessiné
je me demandais si il y avait quelque chose de spécial à faire pour obtenir la même "stabilité" que l'affichage des jbutton que je fais dans le viewport du dessous ?
est-ce dû au fait que le paint n'est pas réappellé autant de fois qu'il devrait l'être ?
(oui je débute en swing )

merci !!



RESOLU :

enfait il y avait deux problèmes, le rafraîchissement et l'algorithme de dessin...

pour le rafrachissement enfait j'ai résolu mon problème en mettant un AdjustmentListener, qui va surveiller les mouvements de la scrollbar et appeller la méthode de dessin quand il le faut.

Dans mon initialisation du scroll pane, je lui donne une scrollbar modifée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
..	
JScrollBar bar = scroller.getHorizontalScrollBar();
bar.addAdjustmentListener(listener);
...

puis, pour forcer le repaint de la règle graduée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
...
public void adjustmentValueChanged(AdjustmentEvent event)
{
	photoDateRuler.revalidate();
	photoDateRuler.repaint();
}
..
voilà au moins si ça peut être utile à quelqu'un d'autre