Nous proposons un exemple qui fait défiler une image. L'image défile de droite à gauche ; quand elle a disparu, elle reparaît à droite. Nous avons choisi de construire une image constituée d'une image chargée à partir d'un fichier (représentant la Terre) et d'une chaîne de caractères et de faire défiler l'image obtenue. L'essentiel du travail consiste à prendre quelques mesures. Nous utilisons encore un timer. Par ailleurs, dans la méthode construireImage, on utilise la méthode createImage définie dans la classe Component ; cette méthode ne peut être utilisée que lorsque le composant à partir duquel on crée l'image est disponible ; c'est pour cette raison qu'on invoque la méthode construireImage dans paintComponent.
À la fin de la méthode construireImage, l'image est écrite dans un fichier.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
class IHMDefile extends JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
private Timer timer;
private int pas = 10;
private int x;
private Image image;
private int largeurImage;
IHMDefile() {
setPreferredSize(new Dimension(400, 150));
setBackground(Color.YELLOW);
timer = new Timer(100, this);
timer.start() ;
}
void construireImage() {
Image terre;
String chaine = "Java est un beau langage et son apprentissage est un vrai plaisir";
try {
terre = javax.imageio.ImageIO.read (new File("world.gif"));
int largeurMonde = terre.getWidth(this);
int hauteurMonde = terre.getHeight(this);
Font fonte = new Font("TimesRoman",Font.PLAIN, 25);
FontMetrics mesure = getFontMetrics(fonte);
int hauteurChaine = mesure.getHeight();
int largeurChaine = mesure.stringWidth(chaine);
largeurImage = largeurChaine + largeurMonde + 10;
int hauteurImage = (hauteurMonde > hauteurChaine ?hauteurMonde : hauteurChaine);
int yChaine = (hauteurImage + mesure.getAscent())/2;
image = createImage(largeurImage, hauteurImage);
Graphics g = image.getGraphics();
g.setColor(Color.YELLOW);
g.fillRect(0, 0, largeurImage, hauteurImage);
g.drawImage(terre, 0, (hauteurImage - hauteurMonde)/2, this);
g.setFont(fonte);
g.setColor(Color.RED);
g.drawString(chaine, largeurMonde + 10, yChaine);
g.dispose();
javax.imageio.ImageIO.write((java.awt.image.BufferedImage)image, "jpeg", new java.io.File("defile.jpg"));
}
catch (IOException exc) {
exc.printStackTrace();
}
}
public void actionPerformed(ActionEvent e) {
x = x - pas;
// si l'image est sortie sur la droite, on la fait repartir de la gauche
if (x < -largeurImage) x = getWidth();
repaint();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
if (image == null) construireImage();
g.drawImage(image, x, 40, this);
}
}
class Defile {
public static void main(String[] arg) {
JFrame fenetre = new JFrame();
fenetre.setContentPane(new IHMDefile());
fenetre.setLocation(100, 100);
fenetre.pack();
fenetre.setVisible(true);
fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
© Irène Charon, Télecom ParisTech, 2011