IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SWT/JFace Java Discussion :

Comment imprimer TableViewer


Sujet :

SWT/JFace Java

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Comment imprimer TableViewer
    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

  2. #2
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut c'est la vie
    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?

  3. #3
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PrintDialog dialog = new PrintDialog(shell);
    PrinterData data = dialog.open();
    Le PrinterData va te servir à paramétrer ton Printer (entre autre l'imprimante à utiliser, si tu veux imprimer en paysage ou en portrait...).
    Ensuite, tu définis ton printer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    myComposite est le Composite contenant ton TableViewer.
    Tu as un snippet sur le site SWT.

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut merci beaucoup je vais essayer tout de suite
    je vais tout de suite essayer merci pour le soutien.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut remercie mais toujtours des soucis
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    où "body" est le composant contenant ma TableViewer et le "parentShell" est le Shell qui contient body.
    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.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    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.
    Merci d'avance pour vos indications.

  6. #6
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    où pShell est me Shell contenant l'affichage, et pControlToPrint le Control à imprimer.

    Sinon, tu as un article sur la classe GC (Graphic Context).

    Voilà, à+
    Gueritarish
    Pas de questions technique par MP, les forums sont là pour ça.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut merci
    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é:
    Images attachées Images attachées  

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Il fallait juste que je fasse shell.update() dans l'événement clic après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PrinterData data = Printer.getDefaultPrinterData();
    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.

    Voici mon code, pour le moment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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();
    SI vous avez des suggestions, merci d'avance.

  9. #9
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Juin 2006
    Messages : 31
    Points : 29
    Points
    29
    Par défaut
    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

  10. #10
    Membre expert
    Avatar de Gueritarish
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mai 2007
    Messages
    1 800
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 800
    Points : 3 919
    Points
    3 919
    Par défaut
    Merci pour ce retour
    Pas de questions technique par MP, les forums sont là pour ça.

Discussions similaires

  1. [VB.NET]Comment Imprimer une form
    Par bernard06 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 19/10/2011, 17h43
  2. [CR] Comment imprimer dans le bon ordre
    Par speed034 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 18/05/2004, 11h11
  3. [Impression] Comment imprimer un .txt?
    Par Grosgrognon dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 27/04/2004, 13h19
  4. Comment imprimer des tabulations ?
    Par Invité dans le forum C++Builder
    Réponses: 2
    Dernier message: 27/11/2002, 11h30
  5. Comment imprimer le contenu d'un TStringGrid
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 19/06/2002, 15h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo