Nur den Inhalt einer JTable ausdrucken

Alles was mit Swing und AWT zu tun hat

Moderatoren: wegus, Olek77

Antworten
Death89
Beiträge: 21
Registriert: 20.12.2011, 12:25

Nur den Inhalt einer JTable ausdrucken

Beitrag von Death89 » 12.03.2012, 11:47

Hey Leute, hab mal wieder nen Problem.

Ich habe eine JTable, die dynamisch mit Werten gefüllt wird. Anschließend soll der User die Möglichkeit haben, diese Tabelle, bzw. deren Inhalt! auszudrucken.
Die Anweisung JTable1.print(); führt zwar zum Ziel, allerdings möchte ich eigentlich nur den Inhalt der Tabelle ausgedruckt haben, und nicht das Gesamte Layout der Tabelle.

Wie kann ich also die Druckanweisung dementsprechend anpassen???

Ich bedanke mich schonmal im Vorraus für eure Hilfe!!

Benutzeravatar
Olek77
Beiträge: 669
Registriert: 21.03.2009, 13:09

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Olek77 » 12.03.2012, 13:25

Hi,

Hm es gibt ja noch weitere überladene Methoden print( ... ). Nur scheint, wenn man die Javadoc dazu liest nicht
viel Möglichkeiten zu sein, nur den Inhalt der Tabelle zu drucken. Du kannst noch ein Footer und Header-MessageFormat angeben.
Versuche es doch mal.

Ne eigene Druckroutine zu schreiben ist übrigens sehr "zäh". Würde ich auf keinen Fall empfehlen.

Viele Grüße,

Olek
- Netbeans Certified Associate -

Death89
Beiträge: 21
Registriert: 20.12.2011, 12:25

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Death89 » 12.03.2012, 13:41

OKAY, aber ne Fuß-/Kopfzeile noch zu definieren, würe ja bedeuten, dass ich noch mehr drum rum habe, als es jetzt schon ist.

Gibts denn dafür keine Plugins/Bibliotheken, die dass bewirken?
Wäre es möglich die Daten aus der Tabelle zu holen und in nen String/Array zu packen und diesen dann auszudrucken?

Benutzeravatar
Olek77
Beiträge: 669
Registriert: 21.03.2009, 13:09

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Olek77 » 12.03.2012, 15:31

Hi,

Haben eben das hier http://www.jguru.com/faq/view.jsp?EID=46732 bei Google gefunden.

Da wird aber doch ein eigener Print-Auftrag gebastelt. Wenn es dir reicht...

Ansonsten kenne ich noch iText : http://itextpdf.com/
Damit kann man relativ komfortabel PDF-Dokumente erstellen.
Oder schau mal bei JFreeChart nach ...

Viele Grüße,
Olek
- Netbeans Certified Associate -

Death89
Beiträge: 21
Registriert: 20.12.2011, 12:25

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Death89 » 13.03.2012, 07:57

Das ist nicht wirklich das, was ich suche...ich will ja keine Charts oder PDFs erstellen...

Joker
Beiträge: 29
Registriert: 12.01.2012, 11:40

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Joker » 15.03.2012, 13:56

Hey,

ich habe auch ein Problem mit dem Drucken. Im Programm wird eine Tabelle angezeigt alles ganz schick aber jetzt möchte ich sie drucken allerdings möchte ich das Layout noch bisschen gestalten. Also habe ich mir gedacht ich baue mir ein panel zusammen ubergebe das und gut is. Aber ganz so funktioniert das leider nicht. Wenn ich das Panel aus dem Programm übergebe wird wenigstens ein Teil gedruckt (passt halt nicht alles rauf). Wenn ich mir nun ein neues panel bau mit allen daten wird lediglich das panel gedruckt und nichts von dem was draufliegt. Vieleicht kann mir ja jemand sagen wo der Fehler liegt.

Hier mal die Druckklasse:

Code: Alles auswählen

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.RepaintManager;

/**
 *
 * @author mpp00353
 */
class Drucken implements Printable {

    private Component componentToBePrinted;

    public static void printComponent(Component c){
        new Drucken(c).print();
    }

    public Drucken(Component componentToBePrinted) {
        this.componentToBePrinted = componentToBePrinted;
    }

    public void print() {
        PrinterJob printJob = PrinterJob.getPrinterJob();
      PageFormat pageFormat = printJob.defaultPage();//new PageFormat();

       try{
           pageFormat.setOrientation(PageFormat.LANDSCAPE);
         }catch(java.lang.IllegalStateException ise)
        {
           System.out.println("Print error...\n"+ise);
       }
      printJob.setPrintable(this,pageFormat);
      if (printJob.printDialog())
        try {
          printJob.print();
        } catch(PrinterException pe) {
          System.out.println("Error printing: " + pe);
        }
    }

    public int print(Graphics g, PageFormat pf, int i) throws PrinterException {
        if(i > 0){
            return(NO_SUCH_PAGE);
        }else{
            Graphics2D g2d = (Graphics2D) g;
            g2d.translate(pf.getImageableX(),pf.getImageableY());
            disableDoubleBuffering(componentToBePrinted);
            componentToBePrinted.paint(g2d);
            enableDoubleBuffering(componentToBePrinted);
            return(PAGE_EXISTS);
        }
    }

    public static void disableDoubleBuffering(Component c) {
        RepaintManager currentManager = RepaintManager.currentManager(c);
        currentManager.setDoubleBufferingEnabled(false);
    }

    public static void enableDoubleBuffering(Component c) {
        RepaintManager currentManager = RepaintManager.currentManager(c);
        currentManager.setDoubleBufferingEnabled(true);
    }
}
Und so rufe ich die KLasse auf:

Code: Alles auswählen

Drucken.printComponent(initPostausgangPanel());
Wobei aus der Methode initPostausgangPanel() das Panel übergen wird.

Benutzeravatar
Olek77
Beiträge: 669
Registriert: 21.03.2009, 13:09

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Olek77 » 15.03.2012, 14:39

Re,

Ich hatte doch in dem Link im zweiten Posting einen Hinweis gegeben wie man die eigene Druckroutine schreibt.

Viele Grüße,

Olek
- Netbeans Certified Associate -

Death89
Beiträge: 21
Registriert: 20.12.2011, 12:25

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Death89 » 15.03.2012, 15:46

Hab jetzt mal ne Notlösung für mein Problem gefunden, allerdings noch nicht perfekt...Hier mein Lösungsansatz:

Ich speichere den String, den ich druckn möchte in einem Text-File.
Anschließend drucke ich die Textdatei mit folgender Funtkion aus...
try {
Desktop.getDesktop().print(new File("Wirdgedruckt.txt"));
}
catch (IOException ex) {}

Soweit so gut..Nun druckt er mir allerdings auch gleich noch ne Kopf-und Fußzeile aus. In dem Fall ist die Kopfzeile "Wirdgedruckt" und die Fußzeile "Seite 1".
Wie kann ich diese beiden Parameter "ausschalten"?

Benutzeravatar
Olek77
Beiträge: 669
Registriert: 21.03.2009, 13:09

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Olek77 » 15.03.2012, 15:58

Hi,

Ich schätze mal, dass du das nur über Umwege - Systemvariablen ändern - lösen kannst.
Die Methode print hat ja außer dem File-Objekt keinerlei Argumente.

Gruß,

Olek
- Netbeans Certified Associate -

Death89
Beiträge: 21
Registriert: 20.12.2011, 12:25

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Death89 » 15.03.2012, 15:59

Ja richtig ;)

Nun...wie sehen denn die "Umwege" aus???

Benutzeravatar
nigjo
Beiträge: 632
Registriert: 08.09.2009, 09:43
Wohnort: Aachen
Kontaktdaten:

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von nigjo » 16.03.2012, 07:42

Hi
Olek77 hat geschrieben:Ich schätze mal, dass du das nur über Umwege - Systemvariablen ändern - lösen kannst.
Das ist so nicht ganz richtig. Das es "Umwege" sind und das es "Systemvariablen" sind ist schon korrekt, aber beides lässt sich nicht von Java aus steuern. Ich zitiere mal die JavaDocs:
JavaDoc zu java.awt.Desktop hat geschrieben:Prints a file with the native desktop printing facility, using the associated application's print command.
Die Klasse java.awt.Desktop (Eingeführt in Java 1.6) dient dazu Standardaufgaben, die der Benutzer normalerweise in seinem Betriebssystem eingestellt hat von Java auf einfache Art und Weise auszuführen. Dies sind die "Befehle" "open", "edit" und "print". Diese sind je nach Dateityp unterschiedlich. Dazu kommen noch die beiden Kommandos "browse" und "mail" mit denen der Standardbrowser und das Standardmailprogramm des Benutzers gestartet werden können.

Die ersten drei Kommandos starten das Programm, welches im Betriebssystem mit der Dateiendung verknüpft ist. Bei ".txt" unter Windows wird dies in vielen Fällen der Notepad sein. Mit deinem Befehl von oben hast du also nicht anderes gemacht als den Befehl "Drucken" im Kontextmenü der Textdatei auszuführen. Man sollte noch bedenken, dass "edit" und "print" nicht für alle Dateitypen definiert sein muss.
Death89 hat geschrieben:Nun...wie sehen denn die "Umwege" aus???
Du musst den Benutzer dazu animieren vor dem Drucken die Kopf- und Fußzeile in seinem Notepad so einzustellen, wie du das gerne hättest. Biete ihm Schokolade an, sowas hilft meistens. ;-)

Gruß
Jens
Man sollte seine Werkzeuge kennen. Ansonsten haut man sich mit dem Hammer nur auf die Finger.

--
NetBeans Certified Engineer - Java Getriebe

Joker
Beiträge: 29
Registriert: 12.01.2012, 11:40

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Joker » 16.03.2012, 11:12

Hey Olek,

habe mir das beispiel aus dem Link angeschaut und mal verwendet funktionert auch aber ich kann am Layout irgendwie nichts ändern. Die Spaltenbreiten bzw der zeilenumbruch in den spalten ist das problem. Habe es mit einem Rendere versucht hat aber irgenwie nicht funktioniert oder habe es an der falschen stelle eingefügt. Vieleicht kann mir ja jemand helfen bei diesem problem.

mfg

Code: Alles auswählen

import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
import javax.swing.table.TableModel;
import sun.awt.X11.ColorData;

/**
 *
 * @author mpp00353
 */
public class Printing implements Printable{

   protected int m_maxNumPage = 1;
  public JTable jTable1;
  public   TableModelAnzeigen  result_data;
  public  JLabel label;

  public  Printing(JTable tab, TableModelAnzeigen deftab, JLabel lab)
  {this.jTable1 = tab;
   jTable1.setDefaultRenderer(Object.class,new AnzeigenTableCellRendere());
   this.result_data  = deftab;
   this.label = lab;
  }
  public void print(){
      try
      {
      PrinterJob prnJob = PrinterJob.getPrinterJob();
      prnJob.setPrintable(this);
      if (!prnJob.printDialog())
        return;
      m_maxNumPage = 1;
      prnJob.print();
      }
      catch (PrinterException e6)
      {
      e6.printStackTrace();
      System.err.println("Printing error: "+e6.toString());
      }
   }

  public int print(Graphics pg, PageFormat pageFormat,
   int pageIndex) throws PrinterException {
    if (pageIndex >= m_maxNumPage)
      return NO_SUCH_PAGE;

    pg.translate((int)pageFormat.getImageableX(),
      (int)pageFormat.getImageableY());
    int wPage = 0;
    int hPage = 0;
    if (pageFormat.getOrientation() == pageFormat.LANDSCAPE) {
      wPage = (int)pageFormat.getImageableWidth();
      hPage = (int)pageFormat.getImageableHeight();
    }
    else {
      wPage = (int)pageFormat.getImageableWidth();
      wPage += wPage/2;
      hPage = (int)pageFormat.getImageableHeight();
      pg.setClip(0,0,wPage,hPage);
    }

    int y = 0;
    pg.setFont(new java.awt.Font("Dialog", 1, 15));
    pg.setColor(Color.black);
    Font fn = pg.getFont();
    FontMetrics fm = pg.getFontMetrics();
    y += fm.getAscent();
    pg.drawString(label.getText(), 300, y);
    y += 20; // space between title and table headers

    Font headerFont = new Font("Dialog", 0, 8);
    pg.setFont(headerFont);
    fm = pg.getFontMetrics();

    TableColumnModel colModel = jTable1.getColumnModel();
    int nColumns = colModel.getColumnCount();
    int x[] = new int[nColumns];
    x[0] = 0;

    int h = fm.getAscent();
    y += h; // add ascent of header font because of baseline
            // positioning (see figure 2.10)

    int nRow, nCol;
    for (nCol=0; nCol<nColumns; nCol++) {
      TableColumn tk = colModel.getColumn(nCol);
      int width = 50;//tk.getWidth();
      if (x[nCol] + width > wPage) {
        nColumns = nCol;
        break;
      }
      if (nCol+1<nColumns)
        x[nCol+1] = x[nCol] + width;
      String title = (String)tk.getIdentifier();
      pg.drawString(title, x[nCol], y);
    }

    pg.setFont(new java.awt.Font("Dialog", 0, 7));
    fm = pg.getFontMetrics();

    int header = y;
    h = fm.getHeight();
    int rowH = Math.max((int)(h*1.5), 10);
    int rowPerPage = (hPage-header)/rowH;
    m_maxNumPage = Math.max((int)Math.ceil(jTable1.getRowCount()/
      (double)rowPerPage), 1);

    TableModel tblModel = jTable1.getModel();
    int iniRow = pageIndex*rowPerPage;
    int endRow = Math.min(jTable1.getRowCount(),
      iniRow+rowPerPage);

    for (nRow=iniRow; nRow<endRow; nRow++) {
      y += h;
      for (nCol=0; nCol<nColumns; nCol++) {
        int col = jTable1.getColumnModel().getColumn(nCol).getModelIndex();
        Object obj = result_data.getValueAt(nRow, col);
        String str = obj.toString();
        if (obj instanceof ColorData)
          pg.setColor(Color.black);
        else
          pg.setColor(Color.black);
          pg.drawString(str, x[nCol], y);
      }
    }
       System.gc();
    return PAGE_EXISTS;
    }

}

Benutzeravatar
smurfi
Site Admin
Beiträge: 1639
Registriert: 29.06.2006, 11:33
Wohnort: Wuppertal
Kontaktdaten:

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von smurfi » 17.03.2012, 08:00

Hallo,

ich würde dir Raten JasperReports zu benutzen.

Gruss
Michael

Benutzeravatar
Olek77
Beiträge: 669
Registriert: 21.03.2009, 13:09

Re: Nur den Inhalt einer JTable ausdrucken

Beitrag von Olek77 » 21.03.2012, 14:38

Hallo,

Sorry, dass ich mich jetzt erst melde.
Muss erst mal die quellen durchblicken.

Ohne es zu überschauen...
Hast du - ohne das Spezialgebiet Drucken - Ahnung von CellRenderern wie z.B. TableCellRenderer?
Die haben nämlich ein für den Anfang ungewöhnliches Verhalten.

Grüße,

Olek
- Netbeans Certified Associate -

Antworten