2010-12-10 4 views
0

J'ai un composant swing qui dessine une grande image vectorielle fixe (mais fixe) et superpose des parties de l'image avec du texte qui devrait s'afficher par rapport au port de vue (pas la position absolue) étiquettes en excel (illustrées ci-dessous):Problème java swing clipping

Header 
-- [some stuff] ----- [ some stuff] ---- 
Header2 
----- [some stuff] ----- [ some stuff] ---- 

Cela fonctionne bien sauf lorsque vous faites défiler de gauche à droite. J'essaie de définir les limites du clip dans la région visible dans la méthode paintComponent() de telle sorte que la fenêtre entière est toujours dessiné - mais cela ne semble pas fonctionner:

public void paintComponent(Graphics graphics) { 
    Graphics2D g = (Graphics2D)graphics; 
    Shape oldClip = g.getClip(); 

    Rectangle clipBounds = getVisibleRect(); 
    g.setClip(clipBounds); 

    drawMyImage(); 
    drawMyHeaders(); 

    g.setClip(oldClip); 
} 

Cependant, cela ne semble pas fonctionner , Je vois la région visible est la bonne forme, mais le réglage du clip n'a aucun effet. Que puis-je faire?

clip: java.awt.Rectangle[x=1762,y=0,width=57,height=182] // clipped while scrolling 
vis: java.awt.Rectangle[x=1762,y=0,width=582,height=182] // what I want to paint 
+2

Ne pas utiliser 'setClip' dans' paintComponent'! La région de découpage est utilisée par Swing. –

+0

Évidemment, je demande la meilleure approche - mais il ne devrait pas y avoir de mal à la placer dans la région visible, à dessiner, puis à la restaurer. Swing semble s'assurer que le clip est durement fixé à la région sale pendant le défilement, fournissant peut-être un sous-contexte graphique. – Justin

Répondre

2

Vous n'êtes pas de passage l'objet graphique dans vos têtes, donc ils doivent être peinture à travers quelque chose d'autre qui ont probablement pas votre jeu de forme de découpage.

Comme commenté, n'utilisez pas setClip dans paintComponent! La région de découpage est utilisée par Swing.

Il semble que ce que vous voulez faire est d'avoir un composant de superposition superposé au-dessus du composant de défilement.

+0

Tout peint dans le cadre d'un seul composant de montage. Le calcul des positions des en-têtes sort lors de la peinture de la chronologie - Donc je ne veux pas vraiment superposer un deuxième composant de swing sur le dessus. – Justin

+0

Comment un composant de superposition définirait-il sa position afin qu'il dessine correctement dans un volet de défilement? – Justin

+0

@Justin En l'absence de gestionnaire de disposition, il suffit de définir sa position dans le composant parent lorsque la zone de défilement se déplace. Vous pourriez diviser le défilement horizontal et vertical, mais cela risque d'avoir des effets secondaires. –