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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    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
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    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 : 40
    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
    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

  4. #4
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    Par défaut merci beaucoup je vais essayer tout de suite
    je vais tout de suite essayer merci pour le soutien.

  5. #5
    Membre à l'essai
    Inscrit en
    Octobre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 6
    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 : 40
    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
    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

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