JTable mit meheren Überschriften ausdrucken

Hallo zusammen,

ich habe seit mehreren Wochen ein Problem, welches ich nicht gelöst bekomme :(.
Daher wollte ich hier mich erkundigen, ob einer von Euch evtl. das Problem lösen oder mir eine andere Variante zur Umsetzung meines „Programms“ nennen kann.
Und hier das besagte Problem:
Ich habe eine JTable (siehe Code), welches ich mit Daten befülle. Später möchte ich die Tabelle ausdrucken. Da ich aber mehre Überschriften
(Bsp.:
Überschrift 1
Überschrift 2
Überschrift 3
)
mit ausdrucken möchte, mir aber die Methode print von JTable nur eine Überschrift erlaubt, dachte ich mir, dass ich einen Zeilenumbruch via HTML mache, so dass ich dann die gewünschten Zeilenumbrüche hin bekomme. Leider geht dies nicht, aus welchem Grund auch immer.
Ich bin am Ende meines Lateins und hoffe Ihr könnt mir weiterhelfen :slight_smile:

Und hier noch der Code

import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.Date;
import javax.swing.*;

public class Beispiel extends JFrame implements ActionListener {
    private JTable table;

    public static void main(String[] args) {
        Beispiel tl = new Beispiel();
        tl.setVisible(true);
        tl.pack();

    }

    public Beispiel() {

        setLayout(new BorderLayout());

        // DruckButton
        JButton print = new JButton("Drucken");
        add(print, BorderLayout.SOUTH);
        print.addActionListener(this);

        // Tabelle
        add(new JScrollPane(createTable()), BorderLayout.CENTER);

        // schließt das Frame
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    public JTable createTable() {

        // titel
        String[] title = new String[]{"A", "B", "C", "D", "E"};

        // daten
        String[][] data = new String[][]{{"", "", "", "", ""},
                {"", "", "", "", ""}};

        table = new JTable(data, title);
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        return table;
    }

    public void actionPerformed(ActionEvent e1) {

        MessageFormat header = new MessageFormat("Überschrift");
        MessageFormat footer = new MessageFormat("Untertitel");
        try {
            table.print(JTable.PrintMode.FIT_WIDTH, header, footer);
        } catch (Exception e2) {
            System.err.format("Cannot print %s%n", e2.getMessage());
        }

    }

}

also ich hab gerade mal “String[] title = new String[]{“A
c”, “B”, “C”, “D”, “E”};” gemacht und als PDF gedruckt und das geht bei mir

@EagleEye: es geht nicht um den TableHeader, sondern um den Report Header/Footer.
Man kann eine Wrapperklasse für den TablePrintable schreiben, die sich um Header/Footer kümmert:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6319903

/*
 * Beispiel.java
 */

import java.awt.*;
import java.awt.event.*;
import java.awt.print.*;
import java.util.logging.*;
import javax.print.attribute.*;
import javax.swing.*;
import javax.swing.JTable.*;
import javax.swing.table.*;

public class Beispiel extends JFrame implements ActionListener {

    private JTable table;

    public static void main(String[] args) {
        Beispiel tl = new Beispiel();
        tl.setVisible(true);
        tl.pack();
    }

    public Beispiel() {
        setLayout(new BorderLayout());
        JButton print = new JButton("Print...");
        add(print, BorderLayout.SOUTH);
        print.addActionListener(this);
        add(new JScrollPane(createTable()), BorderLayout.CENTER);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public JTable createTable() {
        String[] title = new String[]{"A", "B", "C", "D", "E"};
        String[][] data = new String[][]{};
        table = new JTable(new DefaultTableModel(data, title));
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        DefaultTableModel model = (DefaultTableModel) table.getModel();
        for (int i = 0; i < 50; i++) {
            model.addRow(new String[]{"" + i, "", "", ""});
        }
        return table;
    }

    @Override
    public void actionPerformed(ActionEvent e1) {
        printJTable();
    }

    private void printJTable() {
        // possibly prepare the table for printing here first 
        // wrap in a try/finally so table can be restored even if something fails
        try {
            // fetch the printable
            Printable printable = new MyTablePrintable(JTable.PrintMode.FIT_WIDTH);
            PrinterJob job = PrinterJob.getPrinterJob();// fetch a PrinterJob

            job.setPrintable(printable);// set the Printable on the PrinterJob
            // create an attribute set to store attributes from the print dialog

            PrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
            // display a print dialog and record whether or not the user cancels it
            boolean printAccepted = job.printDialog(attr);
            if (printAccepted) {// if the user didn't cancel the dialog

                try {
                    job.print(attr);// do the printing

                } catch (PrinterException ex) {
                    Logger.getLogger(Beispiel.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        } finally {
            // possibly restore the original table state here
        }
    }

    class MyTablePrintable implements Printable {

        private Printable tablePrintable;
        private PageFormat pageFormatJTable;

        public MyTablePrintable(final PrintMode printMode) {
            tablePrintable = table.getPrintable(printMode, null, null);
        }

        @Override
        public int print(final Graphics graphics,
                final PageFormat pageFormat,
                final int pageIndex) throws PrinterException {
            Graphics2D g = (Graphics2D) graphics;
            Paper paper = pageFormat.getPaper();
            int x1 = (int) paper.getImageableX();
            int y1 = (int) paper.getImageableY();
            int w1 = (int) paper.getImageableWidth();
            int h1 = (int) paper.getImageableHeight();
            if (pageFormatJTable == null) {
                pageFormatJTable = new PageFormat();
                Paper paperJTable = new Paper();
                paperJTable.setImageableArea(x1,
                        y1 + 40,//skip header area
                        w1,
                        h1 - 70);//reserve space for header and footer

                pageFormatJTable.setPaper(paperJTable);
            }
            g.drawString("Title 1", x1 + 200, y1 + 14);
            g.drawString("Title 2", x1 + 200, y1 + 24);
            g.drawString("Page " + (pageIndex + 1), x1 + 200, y1 + h1 - 20);
            int index = tablePrintable.print(g, pageFormatJTable, pageIndex);
            return index;
        }
    }
}```

Danke schön!!! :slight_smile:

Kannst du mir viel. noch sagen, wie ich die Fonts für die einzelnen Überschriften ändern kann?
mit

            g.setFont(fontTitel);```

ändere ich alle Überschriften und mit HTML scheint es nicht zu gehen :confused:

Du kannst die gewünschte Font vor jedem drawString setzen.