Hallo,
Nach dem ich die folgende JTable-Print-Klasse aufrufe, bekomme ich zwei Druckdialoge (das Seiteneinrichtungsdialog und das Druckdialog), dann bleibt die Anwendung hängen.
diese Print-Klasse wird von der Hauptprogramm aufgerufen:
Nach dem ich die folgende JTable-Print-Klasse aufrufe, bekomme ich zwei Druckdialoge (das Seiteneinrichtungsdialog und das Druckdialog), dann bleibt die Anwendung hängen.
Code:
public final class JTablePrintable implements Printable, Pageable{
private JTable table;
private JTableHeader header;
private int printWidth;
private int headerHeight;
private int rowHeight;
private PageFormat defaultPageFormat = new PageFormat();
private JTablePrintable(JTable t) {
table = t;
header = table.getTableHeader();
printWidth = table.getWidth();
headerHeight = header.getPreferredSize().height;
rowHeight = table.getRowHeight();
}
private int getNumberOfRowsByPage() {
double tableAvailableSpaceByPage = defaultPageFormat.getImageableHeight()-headerHeight;
return((int)Math.floor(tableAvailableSpaceByPage/rowHeight));
}
private int getTableVerticalShiftForIndex(int index) {
int shiftY = (getNumberOfRowsByPage()*rowHeight*index);
return(shiftY);
}
public int getNumberOfPages() {
int nbPages = (int)Math.ceil(table.getRowCount()/(double)getNumberOfRowsByPage());
return(nbPages);
}
public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException {
if (pageIndex<1 && pageIndex>getNumberOfPages()) {
throw new IndexOutOfBoundsException("Page "+pageIndex+" doesn't exist!");
}
else {
return(defaultPageFormat);
}
}
public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException {
if (pageIndex<1 && pageIndex>getNumberOfPages()) {
throw new IndexOutOfBoundsException("Page "+pageIndex+" doesn't exist!");
}
else {
return(this);
}
}
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageIndex<1 && pageIndex>getNumberOfPages()) {
return Printable.NO_SUCH_PAGE;
}
Graphics2D g = (Graphics2D)graphics;
double scaleX = pageFormat.getImageableWidth()/printWidth;
boolean needScale = scaleX < 1;
g.translate(pageFormat.getImageableX(),pageFormat.getImageableY());
if (needScale) {
g.scale(scaleX,1);
}
g.setClip(0,0,printWidth,headerHeight);
header.printAll(g);
g.translate(0,headerHeight);
g.setClip(0,0,printWidth, getNumberOfRowsByPage()*rowHeight);
g.translate(0,-getTableVerticalShiftForIndex(pageIndex));
table.printAll(g);
return Printable.PAGE_EXISTS;
}
private void startPrinting() {
PrinterJob printerJob = PrinterJob.getPrinterJob();
printerJob.setJobName("Printing table");
defaultPageFormat = printerJob.defaultPage();
defaultPageFormat.setOrientation(defaultPageFormat.LANDSCAPE);
defaultPageFormat = printerJob.pageDialog(defaultPageFormat);
printerJob.setPageable(this);
if (printerJob.printDialog()) {
try {
printerJob.print();
}
catch (PrinterException e) {
System.out.println(e);
}
}
}
public static void printTable(JTable t) {
JTablePrintable utility = new JTablePrintable(t);
utility.startPrinting();
}
}
Code:
private String data[zeile][spalte];
private String[] spaltenNamen {"aaa", „bbb“, „…“};
…
meinTabelle = new JTable(data, spaltenNamen);
…
jPanelUnten.add(jButtDruck);
jButtDruck.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// Druck die akteulle Tabelle
JTablePrintable.printTable( (meinTabelle);
}
});