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
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());
}
}
}
/*
* 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;
}
}
}```