Interface graphique en Java le clipping

Cours interface graphique en Java le clipping, tutoriel & guide de travaux pratiques JAVA en pdf.

Contrat d’opacité

● si on n’hérite pas d’un composant existant et si le composant ne remplit pas toute la zone de dessin, il faut obéir au contrat d’opacité:
– si le composant est opaque, on remplit la zone avec la couleur de fond
– sinon, on ne fait rien
if (isOpaque()) {
g.setColor(getBackground());
g.fillRect(0,0,getWidth(),getHeight());
}

Comment dessiner

● dessin en récupérant le Graphics d’un composant:
public class VolatileScratch extends JComponent {
public VolatileScratch(int width,int height) { setPreferredSize(new Dimension(width,height)); addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
Graphics g=getGraphics();
try {
g.setColor(Color.GREEN);
g.fillOval(e.getX()-7,e.getY()-7,14,14);
} finally {
g.dispose();
}
}
});
}

}
● problème: quand on doit rafraîchir la fenêtre, on perd ce qui n’était plus visible
● solution: dessiner dans une image
public class PersistentScratch extends JComponent { private final BufferedImage image;
public PersistentScratch(int width,int height) { setPreferredSize(new Dimension(width,height));
/* We just want to keep a reference on image, not on the whole component */ final BufferedImage image=new BufferedImage(
width,height,BufferedImage.TYPE_INT_ARGB);
this.image=image;
addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) {
Graphics g=image.getGraphics();
try {
g.setColor(Color.GREEN);
g.fillOval(e.getX()-7,e.getY()-7,14,14);
paintImmediately(0,0,getWidth(),getHeight());
} finally {
g.dispose();
}
} image transparente
});
}

}
● dans ce cas, le rafraîchissement consiste juste à afficher l’image:
@Override protected void paintComponent(Graphics g) { g.drawImage(image,0,0,null);
}
Yes!

ImageObserver

● le dernier paramètre de drawImage est un ImageObserver, qui sert à être prévenu du chargement de l’image
● dans notre cas, null signifie que l’on s’en fiche:
@Override protected void paintComponent(Graphics g) { g.drawImage(image,0,0,null);
}

Le clipping

● zone de clipping=pochoir appliqué au dessin qui va suivre
● on peut définir soit une zone rectangulaire:
– setClip(int x,int y,int width,int height)
● soit une zone quelconque:
– setClip(Shape clip)
● exemple: utilisation d’un disque pour n’afficher qu’une portion d’image
@Override
protected void paintComponent(Graphics g) { g.setColor(getBackground()); g.fillRect(0,0,getWidth(),getHeight()); if (x==-1 && y==-1) {
return;
}
Shape clip=new Ellipse2D.Float( x-60,y-60,120,120);
g.setClip(clip); g.drawImage(image,0,0,null);
}
ce qui est dessiné avant setClip n’est pas concerné (ici, remplissage avec du noir)
● on met à jour les coordonnées en fonction de la position de la souris
public class LookThroughTheHole extends JComponent {
final Image image;
int x,y;
public LookThroughTheHole(ImageIcon icon) {
setPreferredSize(new Dimension(icon.getIconWidth(),icon.getIconHeight()));
final Image image=icon.getImage();
this.image=image;
addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseMoved(MouseEvent e) {
x=e.getX(); y=e.getY(); paintImmediately(0,0,getWidth(),getHeight());
}
});
addMouseListener(new MouseAdapter() {
@Override public void mouseExited(MouseEvent e) {
x=-1; y=-1;
paintImmediately(0,0,getWidth(),getHeight());
}
});
}

}
● problème: on voudrait pouvoir cacher le curseur
● on doit créer notre propre curseur invisible final Cursor noCursor=Toolkit.getDefaultToolkit().createCustomCursor(
new BufferedImage(1,1,BufferedImage.TYPE_INT_ARGB),new Point(0,0), » »);
taille minimum image hotspot du d’une image transparente curseur

Le XOR mode

● on peut définir le mode de dessin:
– peinture en écrasement (mode par défaut): setPaintMode()
– combinaison avec la couleur des pixels en dessous: setXORMode(Color c)

Graphics2D

● Graphics2D étend Graphics et permet de gérer de nouvelles choses:
– le pinceau à utiliser
– la transparence
– le dessin de formes complexes
– les options de rendus
– les transformations affines
● en Swing, c’est toujours un Graphics2D, qui est réellement reçu; on peut donc toujours caster un Graphics en Graphics2D

……….

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *