Java-在同一页中使用不同字体打印标题

Java-在同一页中使用不同字体打印标题,java,swing,printing,Java,Swing,Printing,我想用不同的字体打印两个标题,然后用另一种字体打印表格标题和所有行。我在JTable中有表内容。当用户单击按钮时,我想将所有内容发送到PrinterServices,并以横向方向打印它们。可能有很多行,所以我需要分页。分页在左下角 我发现无法使用JTable.print,因为我需要font1中的标题、font2中的副标题以及font3中的表头/表格数据 我该怎么做 我看过这一页,向我展示了如何在几页中以不同的样式打印: 但是我认为这个链接将不同的样式放在不同的页面中,在我的情况下,title1

我想用不同的字体打印两个标题,然后用另一种字体打印表格标题和所有行。我在
JTable
中有表内容。当用户单击按钮时,我想将所有内容发送到
PrinterServices
,并以
横向
方向打印它们。可能有很多行,所以我需要分页。分页在左下角

我发现无法使用
JTable.print
,因为我需要
font1
中的标题、
font2
中的副标题以及
font3
中的表头/表格数据

我该怎么做

我看过这一页,向我展示了如何在几页中以不同的样式打印:

但是我认为这个链接将不同的样式放在不同的页面中,在我的情况下,
title1
title2
在第一页,页面的其余部分填充了行数据,然后是第2页,第3页。。。因此,它在同一个页面中包含多个样式,并且与链接的功能不完全相同

编辑:

现在我有了这些代码,但它们在两个方面不起作用:

  • 我必须在打印对话框提示中设置方向(选择“水平”方向)。默认情况下我想要它,但我不想要Java本机页面设置对话框。我想要一个依赖于系统的

  • 左边距/缩进随着页码的增加而增加。我希望它是静态的。我一定把坐标弄乱了

  • 分页脚不在那里。我怎样才能得到它

  • 因此,我:

    import java.awt.Font;
    import java.awt.FontMetrics;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.print.PageFormat;
    import java.awt.print.Paper;
    import java.awt.print.Printable;
    import java.awt.print.PrinterException;
    import java.awt.print.PrinterJob;
    
    import javax.print.attribute.HashPrintRequestAttributeSet;
    import javax.print.attribute.PrintRequestAttributeSet;
    
    public class PrintingTest1 {
        /**
         * @param args
         */
        public static void main(String[] args) {
            PrinterJob job = PrinterJob.getPrinterJob();
            //cross-platform print dialog, java l&f
    //        PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
            //java page setup dialog
    //        PageFormat pf = job.getPageFormat(aset);
    //        job.setPrintable(new PrintingTest1().new HelloWorldPrinter(), pf);
            //java print setup dialog
    //        boolean doPrint = job.printDialog(aset);
    //        if (doPrint) {
    //            try {
    //                job.print(aset);
    //            } catch (PrinterException e) {
    //                System.out.println("Cancelled. ");
    //            }
    //        }
    
            //native print dialog
    
            PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
            Font font1 = new Font("Courier New", Font.PLAIN, 12);
            Font font2 = new Font("Courier New", Font.PLAIN, 10);
            Font font3 = new Font("Courier New", Font.PLAIN, 9);
            HelloWorldPrinter printer = new PrintingTest1().new HelloWorldPrinter();
            printer.setFont1(font1);
            printer.setFont2(font2);
            printer.setFont3(font3);
    
            printer.setTitle1("Title 1: Main title");
            printer.setTitle2line1("Title 2 line 1: top");
            printer.setTitle2line2("Title 2 line 2: bot");
            printer.setHeaderline1("HeaderLine1: top");
            printer.setHeaderline2("HeaderLine2: bot");
    
            String[][] rows = new String[85][2];
            for (int i=0; i<rows.length; i++) {
                rows[i] = new String[] {"row " + i + ", line 1", "      row " + i + ", line 2"};
            }
            printer.setRows(rows.length);
    
            printer.setRowsData(rows);
            job.setPrintable(printer);
            boolean doPrint = job.printDialog();
            if (doPrint) {
                try {
                    job.print();
                } catch (PrinterException e) {
                    System.out.println("Cancelled. ");
                }
            }
        }
    
    
        class HelloWorldPrinter implements Printable {
            private Font font1;
            private Font font2;
            private Font font3;
    
            private int lineHeight1;
            private int lineHeight2;
            private int lineHeight3;
    
            private String title1;
            private String title2line1;
            private String title2line2;
            private String headerline1;
            private String headerline2;
    
            private String[][] rowsData;
    
            /** 
             * Number of rows in the table
             */
            private int rows;
    
            /**
             * Number of lines of data to print. 2*rows.
             */
            private int dataLines;
    
            private int pageLimit;
            private int linesDataOnPage0;
            private int linesOnPage0;
            private int linesPerPage;
    
            /**
             * The array index of row data when every new pages starts to print.
             */
            private int newStartIndex;
            public void setRows(int rows) {
                this.rows = rows;
            }
    
            public void setFont1(Font font1) {
                this.font1 = font1;
            }
    
            public void setFont2(Font font2) {
                this.font2 = font2;
            }
    
            public void setFont3(Font font3) {
                this.font3 = font3;
            }
    
    
            public void setTitle1(String title1) {
                this.title1 = title1;
            }
    
            public void setTitle2line1(String title2line1) {
                this.title2line1 = title2line1;
            }
    
            public void setTitle2line2(String title2line2) {
                this.title2line2 = title2line2;
            }
    
            public void setHeaderline1(String headerline1) {
                this.headerline1 = headerline1;
            }
    
            public void setHeaderline2(String headerline2) {
                this.headerline2 = headerline2;
            }
    
            public void setRowsData(String[][] rowsData) {
                this.rowsData = rowsData;
            }
    
            public HelloWorldPrinter() {
                // TODO Auto-generated constructor stub
            }
    
    
            private int calculatePageLimit(int dataLines, Graphics g, PageFormat pf) {
                FontMetrics metrics1 = g.getFontMetrics(font1);
                FontMetrics metrics2 = g.getFontMetrics(font2);
                FontMetrics metrics3 = g.getFontMetrics(font3);
                lineHeight1 = metrics1.getHeight();
                lineHeight2 = metrics2.getHeight();
                lineHeight3 = metrics3.getHeight();
    
                double pageHeight = pf.getImageableHeight();
    
                //title 1, title 2 (2 lines), header (2 lines)
                linesDataOnPage0 = (int)((pageHeight - lineHeight1 - lineHeight2*2 - lineHeight3*2) / lineHeight3);
                linesOnPage0 = linesDataOnPage0 + 5;
    
                linesPerPage = (int)pageHeight / lineHeight3;
    
                int pageLimit0 = 0;
                if (dataLines <= linesDataOnPage0) {
                    pageLimit0 = 1; //all data can be printed on the first page.
                } else {
                    int lastPageLines = (dataLines - linesDataOnPage0) % linesPerPage;
                    pageLimit0 = (dataLines - linesDataOnPage0 - lastPageLines) / linesPerPage + 2;
                }
    
                return pageLimit0;
            }
            @Override
            public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
                if (pageLimit == 0) { //not calculated yet.
                    this.dataLines = rows * 2;
                    pageLimit = calculatePageLimit(dataLines, graphics, pageFormat);
                }
                Paper papel = new Paper();
                papel.setImageableArea(72, 72, 697, 450);
                papel.setSize(841, 595);
                pageFormat.setPaper(papel);
                pageFormat.setOrientation(PageFormat.LANDSCAPE);
                Graphics2D g2d = (Graphics2D)graphics;
                g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
    
                if (pageIndex < pageLimit) {
                    int y = 10;
    
                    if (pageIndex == 0) {
                        // 1. print the title 1
                        g2d.setFont(font1);
                        g2d.drawString(title1, 10, y);
                        y += lineHeight1;
    
                        // 2. print title 2
                        g2d.setFont(font2);
                        g2d.drawString(title2line1, 10, y);
                        y += lineHeight2;
                        g2d.drawString(title2line2, 10, y);
                        y += lineHeight2;
    
                        // 3. print header
                        g2d.setFont(font3);
                        g2d.drawString(headerline1, 10, y);
                        y += lineHeight3;
                        g2d.drawString(headerline2, 10, y);
                        y += lineHeight3;
    
                        // 4. print data
                        for (int i=0; i< (int)(linesDataOnPage0 / 2); i++) {
                            g2d.drawString(rowsData[i][0], 10, y);
                            y += lineHeight3;
                            g2d.drawString(rowsData[i][1], 10, y);
                            y += lineHeight3;
                        }
    
                        y = 0;
                        newStartIndex = (int)(linesDataOnPage0 / 2);
                        return PAGE_EXISTS;
                    } else {
                        int end;
                        if (newStartIndex + (int)(linesPerPage / 2)  > rowsData.length) {
                            end = rowsData.length;
                        } else {
                            end = newStartIndex + (int)(linesPerPage / 2);
                        }
                        g2d.setFont(font3);
                        for (int i=newStartIndex; i< end; i++) {
                            g2d.drawString(rowsData[i][0], 10, y);
                            y += lineHeight3;
                            g2d.drawString(rowsData[i][1], 10, y);
                            y += lineHeight3;
                        }
    
                        y = 0;
                        newStartIndex +=(int)(linesPerPage / 2);
                        return PAGE_EXISTS;
                    }
                } else {
                    return NO_SUCH_PAGE;
                }
            }
    
        }
    }
    
    导入java.awt.Font;
    导入java.awt.FontMetrics;
    导入java.awt.Graphics;
    导入java.awt.Graphics2D;
    导入java.awt.print.PageFormat;
    导入java.awt.print.Paper;
    导入java.awt.print.Printable;
    导入java.awt.print.PrinterException;
    导入java.awt.print.PrinterJob;
    导入javax.print.attribute.HashPrintRequestAttributeSet;
    导入javax.print.attribute.PrintRequestAttributeSet;
    公共类打印测试1{
    /**
    *@param args
    */
    公共静态void main(字符串[]args){
    PrinterJob job=PrinterJob.getPrinterJob();
    //跨平台打印对话框,java l&f
    //PrintRequestAttributeSet aset=新的HashPrintRequestAttributeSet();
    //java页面设置对话框
    //PageFormat pf=job.getPageFormat(aset);
    //作业.setPrintable(新的PrintingTest1().新的HelloWorldPrinter(),pf);
    //java打印设置对话框
    //布尔doPrint=job.printDialog(aset);
    //if(doPrint){
    //试一试{
    //打印作业(aset);
    //}catch(PrinterException e){
    //System.out.println(“取消”);
    //            }
    //        }
    //本机打印对话框
    PrintRequestAttributeSet aset=新的HashPrintRequestAttributeSet();
    Font font1=新字体(“Courier new”,Font.PLAIN,12);
    Font font2=新字体(“Courier new”,Font.PLAIN,10);
    Font font3=新字体(“Courier new”,Font.PLAIN,9);
    HelloWorldPrinter printer=新打印测试1()。新HelloWorldPrinter();
    打印机。setFont1(font1);
    打印机。setFont2(font2);
    打印机。setFont3(font3);
    打印机。设置标题1(“标题1:主标题”);
    打印机。设置标题2行1(“标题2行1:顶部”);
    打印机。设置标题2行2(“标题2行2:bot”);
    打印机.setHeaderline1(“HeaderLine1:top”);
    打印机.setHeaderline2(“HeaderLine2:bot”);
    字符串[][]行=新字符串[85][2];
    
    对于(int i=0;我可能会发布一些代码,并展示一个示例来说明你的意思。在这种情况下,如果没有可视化,很难理解。我会推荐类似Jasper Reports的内容,谢谢你的回答。我已经编辑了问题以显示更多代码。如果有人想结束问题,请留下评论来解释你自己如果你不介意的话,请尊重我。