j'ai un composite qui contient un TableViewer et je voudrais imprimer ce composite mais ce TableViewer est un peut lagre donc je dois aussi config la largeur.
merci d'avance
Version imprimable
j'ai un composite qui contient un TableViewer et je voudrais imprimer ce composite mais ce TableViewer est un peut lagre donc je dois aussi config la largeur.
merci d'avance
Je viens de faire le tour, je pense qu'il n'existe pas de solution pour imprimer les composant SWT. Car si un composant n'est pas visible entièrement sur un écran (avec scrollbars) on ne peut utiliser le GC.
J'aurais dû utiliser Swing. Maintenant je dois recréer un JTable à partir de mon TableViewer. c'est la vie.
Une question bête les tableaux généralement doivent-ils être imprimable? Parce qu'on a pas pensé à intégrer l'impression dans SWT comme dans Swing?
Salut,
SWT intègre très bien l'impression. Seulement, cela est fait d'une manière différente de Swing. Tu peux passer par la classe Printer (qui va te servir pour ton impression à proprement parler).
Une autre classe intéressante est la classe PrinterDialog. Tu l'utilises en faisant:
Le PrinterData va te servir à paramétrer ton Printer (entre autre l'imprimante à utiliser, si tu veux imprimer en paysage ou en portrait...).Code:
1
2 PrintDialog dialog = new PrintDialog(shell); PrinterData data = dialog.open();
Ensuite, tu définis ton printer:
où myComposite est le Composite contenant ton TableViewer.Code:
1
2
3
4
5
6
7 Printer myPrinter = new Printer(data); myPrinter.startJob("Print"); myPrinter.startPage(); GC gc = new GC(printer); myComposite.print(gc); myPrinter.endPage(); myPrinter.endJob();
Tu as un snippet sur le site SWT.
Voilà, à+
Gueritarish
je vais tout de suite essayer merci pour le soutien.
En effet j'ai essayé ce que vous m'avez dit mais je ne sais pas comment créer la variable Printer, j'ai fais comme suit mais j'ai une page vide qui est imprimée.
où "body" est le composant contenant ma TableViewer et le "parentShell" est le Shell qui contient body.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 PrintDialog dialog = new PrintDialog(parentShell); dialog.getStartPage(); PrinterData data = dialog.open(); Printer myPrinter = new Printer(data); myPrinter.startJob("Print"); myPrinter.startPage(); GC printer1 = new GC (myPrinter); //GC gc = new GC(printer); body.print(printer1); myPrinter.endPage(); myPrinter.endJob();
Malheureusement, j'ai toujours une page vide qui est imprimée.
Je voulais vous dire aussi que j'ai utilisé un autre code pour imprimer tout le Shell et ça ne marche pas j'ai un tout petit rectangle qui est imprimé qui contient mon Shell et une partie de mon font d'écran du bureau. le code que j'ai utiliser pour imprimer mon Shell est celui-ci.
Je n'ai jamais travaillé avec les GC donc si vous avez des cours là dessus, n'hésitez pas. Pour terminer la solution qui marche c'est de créer une JTable à partir de mon TableViewer et ensuite de créer un JPanel en arrière plans et d'y mettre ma JTable mais c'est trop null. Je le sais.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 PrinterData data = Printer.getDefaultPrinterData(); if (data == null) { System.out.println("Warning: No default printer."); d.dispose(); return; } Printer printer = new Printer(data); if (printer.startJob("SWT Printing Snippet")) { Color black = printer.getSystemColor(SWT.COLOR_BLACK); Color white = printer.getSystemColor(SWT.COLOR_WHITE); Rectangle trim = printer.computeTrim(0, 0, 0, 0); Point dpi = printer.getDPI(); int leftMargin = dpi.x + trim.x; // one inch from left side of paper if (leftMargin < 0) leftMargin = -trim.x; // make sure to print on the printable area int topMargin = dpi.y / 2 + trim.y; // one-half inch from top edge of paper if (topMargin < 0) topMargin = -trim.y; // make sure to print on the printable area GC gcPrint = new GC(printer); if (printer.startPage()) { gcPrint.setBackground(white); gcPrint.setForeground(black); GC gc = new GC(d); final Image image = new Image(d, d.getBounds()); gc.copyArea(image, 0, 0); gcPrint.drawImage(image, leftMargin, topMargin); printer.endPage(); } gcPrint.dispose(); printer.endJob(); } printer.dispose();
Merci d'avance pour vos indications.
Salut,
Alors, j'ai lu dans la FAQ SWT qu'il fallait d'abord faire une image du contrôle que l'on voulait afficher (sinon, il prend la résolution du Display affiché à l'écran qui peut être différente de celle que l'on veut utiliser).
Donc, ce code est plus "pertinent" que le précédent:
où pShell est me Shell contenant l'affichage, et pControlToPrint le Control à imprimer.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 // On récupère les informations d'impression: PrintDialog dialog = new PrintDialog(pShell); PrinterData data = dialog.open(); // On définit une image du controle à imprimer: Point size = pControlToPrint.getSize(); Image printImage = new Image(pShell.getDisplay(), size.x, size.y); GC gcControl = new GC(pControlToPrint); gcControl.copyArea(printImage, 0, 0); Printer printer = new Printer(data); ImageData imageData = printImage.getImageData(); Rectangle trim = printer.computeTrim(0, 0, 0, 0); Point printerDPI = printer.getDPI(); Point displayDPI = pShell.getDisplay().getDPI(); // On calcule le facteur d'agrandissement à appliquer à l'impression: int scaleFactor = printerDPI.x / displayDPI.x; printer.startJob("Print"); printer.startPage(); // On va "peindre" l'image retaillée dans notre objet Printer: Image printedImage = new Image(printer, imageData); GC gcPrinter = new GC(printer); gcPrinter.drawImage(printedImage, 0, 0, imageData.width, imageData.height, -trim.x, -trim.y, scaleFactor * imageData.width, scaleFactor * imageData.height); printer.endPage(); printer.endJob(); // On libère les ressources utilisées: printer.dispose(); gcPrinter.dispose(); gcControl.dispose(); printImage.dispose(); printedImage.dispose();
Sinon, tu as un article sur la classe GC (Graphic Context).
Voilà, à+
Gueritarish
Merci ça marche très bien, je désespérais un peu.
Mais j'ai un souci quand j'imprime, cela m'imprime mon composite comme fond d'écran. C'est bien mais cela m'imprime aussi la page qui s'affiche qui nous permet de choisir le nom de l'imprimante. Je pense qu'il faut que je fasse un refresh mais je ne sais pas où. En fait, c'est l'image que j'ai au dessous qui est imprimé:
Il fallait juste que je fasse shell.update() dans l'événement clic après
Mais dommage il reste encore un souci. Dans le tableau qui est imprimé, il manque la dernière colonne mais je vais essayer de jouer sur le facteur de la largeur ou de redimensionner carrément mon image. Reste à savoir comment.Code:PrinterData data = Printer.getDefaultPrinterData();
Voici mon code, pour le moment:
SI vous avez des suggestions, merci d'avance.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42 PrinterData data = Printer.getDefaultPrinterData(); s.update(); //s c'est mon shell PrintDialog dialog = new PrintDialog(s); data = dialog.open(); // On définit une image du controle à imprimer: Point size = center.getSize(); //center c'est le composite que je veux imprimer Image printImage = new Image(s.getDisplay(), size.x, size.y); GC gcControl = new GC(center); gcControl.copyArea(printImage, 0, 0); Printer printer = new Printer(data); ImageData imageData = printImage.getImageData(); Rectangle trim = printer.computeTrim(0, 0, 0, 0); Point printerDPI = printer.getDPI(); Point displayDPI = s.getDisplay().getDPI(); // On calcule le facteur d'agrandissement à appliquer à l'impression: int scaleFactor = printerDPI.x / displayDPI.x; printer.startJob("Print"); printer.startPage(); // On va "peindre" l'image retaillée dans notre objet Printer: Image printedImage = new Image(printer, imageData); GC gcPrinter = new GC(printer); gcPrinter.drawImage(printedImage, 0, 0, imageData.width, imageData.height, -trim.x, -trim.y, scaleFactor * imageData.width, scaleFactor * imageData.height); printer.endPage(); printer.endJob(); // On libère les ressources utilisées: printer.dispose(); gcPrinter.dispose(); gcControl.dispose(); printImage.dispose(); printedImage.dispose();
Je m'intéresse aussi actuellement à l'impression sous SWT et voici mon constat :
- la plupart des composants SWT s'imprime correctement avec la méthode Control.print()
- si le Control dépasse les bornes d'impressions (tableau plus grand que la largeur de la page), il faudra gérer ce cas de figure de manière programmatique (assez contraignant).
Je me suis donc pencher sur PaperClips une librairie SWT qui permet de s'abtraire de ces problèmes de dimensionnement/positionnement.
L'auteur propose un nombre conséquent de Snippet démontrant les posibilités de l'API.
Sans plus attendre : PaperClips
Merci pour ce retour :ccool: