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