Imprimer un composant graphique

     

alt : l'applet n'est pas visible par votre navigateur ; pour voir l'application, vous devez télécharger le code, le compiler et l'exécuter
Peut-être voyez-vous une fenêtre venant d'une applet et permettant de tester le programme commenté ici.

Ce que vous voyez ci-dessous n'est pas une applet mais deux résultats de l'application présentée dans cet exemple. L'objectif de l'application est d'avoir une fenêtre représentée par le dessin de gauche qui permette d'imprimer ou bien cette fenêtre tout entière, ou bien le JPanel contenant le dessin qui est à l'intérieur. Plus précisément, si on clique sur le bouton "imprimer", une fenêtre de dialogue apparaît, qui propose d'imprimer : il faut y indiquer une imprimante (on peut aussi choisir d'imprimer sur un fichier postcript) et l'impression correspond au choix indiqué par les cases à cocher.

Vous pouvez voir ci-dessous la fenêtre initiale de l'application et la fenêtre obtenue quand on appuie sur le bouton "imprimer".

        

Le dessin est ici réalisé dans une instance de la classe MonDessin ; on peut imprimer soit toute la fenêtre, soit le contenu de cette instance de la classe MonDessin, selon ce qu'on coche avec les boutons-radios.

Le programme utilisé est le suivant :

import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.ButtonGroup;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.PrintJob;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.util.Properties;

class MonDessin extends JPanel  {
    MonDessin() {
	setPreferredSize(new Dimension(180, 120));
    }
    public void paintComponent(Graphics g) {
	g.drawOval(50, 20, 80, 80);
    }
}

public class Imprimer extends JFrame implements  ActionListener {  
    MonDessin dessin = new MonDessin();
    JButton imprimer = new JButton("imprimer");
    JRadioButton choixTout = new JRadioButton("tout", true);
    JRadioButton choixDessin = new JRadioButton("dessin", false);
    
    public Imprimer() {
	ButtonGroup choix = new ButtonGroup();
	choix.add(choixTout);
	choix.add(choixDessin);
	
	JPanel p = new JPanel();
	p.add(choixTout);
	p.add(choixDessin);
	add(p, BorderLayout.NORTH);
	add(dessin, BorderLayout.CENTER);
	add(imprimer, BorderLayout.SOUTH);

	imprimer.addActionListener(this);

	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	pack();
	setVisible(true);	
    }
    
    public void actionPerformed(ActionEvent e) {
	Properties props = new Properties();
	
	props.setProperty("awt.print.paperSize", "a4");
	props.setProperty("awt.print.destination", "printer");
	
	PrintJob demandeDImpression = getToolkit().getPrintJob(this, "Impression", props);
	if (demandeDImpression != null) {
	    Graphics gImpr = demandeDImpression.getGraphics();
	    if (choixTout.isSelected()) printAll(gImpr);
	    else dessin.printAll(gImpr);
	    gImpr.dispose();
	    demandeDImpression.end();
	    
	}
    }
}

class EssaiImprimer {
    public static void main(String[] arg) {
	new Imprimer();
    }
}
Vous pouvez aussi récupérer ce programme ou bien le code de l'applet
java.util.Properties : cette classe qui hérite de la classe Haschtable permet de lister des propriétés. Cette classe assez technique peut être consultée en ligne. Observez déjà l'usage que nous en faisons ici.
props.setProperty("awt.print.paperSize", "a4"); : on souhaite que le choix par défaut du format de papier soit le format A4 (obligatoirement représenté par a4 avec une minuscule). On définit pour cela la propriété identifiée par la chaîne de caractères "awt.print.paperSize" en lui associant la valeur "a4" dans l'objet props. Cet objet servira dans l'instruction commentée ci-dessous à définir les caractéristiques de l'impression. Ce choix de format peut être modifié par la fenêtre de dialogue obtenue juste avant l'impression.
getToolkit().getPrintJob(this,"Impression", props); : la méthode getPrintJob de la classe Toolkit retourne une instance de la classe java.awt.PrintJob. Cette classe sert à initialiser une impression et fait apparaître la fenêtre de dialogue qui est modale. La méthode getPrintJob renvoie null si l'utilisateur a appuyé sur le bouton Cancel. Le premier argument de la méthode getPrintJob doit être une instance de la classe Frame (dont hérite la classe JFrame) qui indique la fenêtre concernée, le second est le titre du travail d'impression, le troisième sert à transmettre certains choix pour l'impression.
demandeDImpression.getGraphics() : permet de récupérer le contexte graphique servant à tracer la prochaine page à imprimer.
printAll(pg) : la méthode printAll est définie dans la classe Component. Elle permet de tracer l'ensemble du composant concerné (ses sous-composants et ce que l'obtient à l'aide des méthodes paintComponent du composant et de ses sous-composants) en utilisant le contexte graphique indiqué en argument.
gImpr.dispose() : cela permet de libérer les ressources liées à un contexte graphique gImpr. La page est imprimée au moment de cette instruction.
demandeDImpression.end() : termine l'impression et effectue quelques nettoyages utiles.

© Irène Charon, Télécom ParisTech 2011