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
- 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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 scroller.setColumnHeaderView(photoDateRuler); scroller.setViewportView(photoPanel);
- 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
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é
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..) }![]()
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 :
voilà au moins si ça peut être utile à quelqu'un d'autre
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(); } ..![]()
Partager