0

我想用两张桌子打印 jpanel。我面临两个问题,第一个是打印图像的准确性不是很好。第二个如何控制打印页面上jpanel的大小?

这是使用 xps 查看器打印的页面的图像(精度不好) 在此处输入图像描述

在此处输入图像描述是否可以像这样以这种精度制作打印图像

这是代码:

     PrinterJob printjob = PrinterJob.getPrinterJob();
    printjob.setJobName(" TESSCO CUSTOMER CARD ");

    Printable printable = new Printable() {

            public int print(Graphics pg, PageFormat pf, int pageNum) {

                    if (pageNum > 0) {
                            return Printable.NO_SUCH_PAGE;
                    }

                    Dimension size = jPanel1.getSize();
                    BufferedImage bufferedImage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);

                    jPanel1.print(bufferedImage.getGraphics());

                    Graphics2D g2 = (Graphics2D) pg;
                    g2.translate(pf.getImageableX(), pf.getImageableY());
                    g2.drawImage(bufferedImage, 0, 0, (int) pf.getWidth(), (int) pf.getHeight(), null);

                    return Printable.PAGE_EXISTS;
            }
    };

    Paper paper = new Paper();
    paper.setImageableArea(0, 0,700,890);
    paper.setSize(700,890);

    PageFormat format = new PageFormat();
    format.setPaper(paper);
    format.setOrientation(PageFormat.LANDSCAPE);

    printjob.setPrintable(printable, format);
    if (printjob.printDialog() == false)
            return;

    try {
            printjob.print();
    } catch (PrinterException ex) {
            System.out.println("NO PAGE FOUND." + ex);

    }
4

1 回答 1

1

首先,不要使用窗格大小,您需要充当布局管理器并调整面板大小以适合页面。

其次,不要使用缓冲图像。这不会与打印引擎传递给您的图形上下文共享相同的属性。另外,另一种打印方法是可重入的,这意味着它可能会为每一页调用多次,这样创建缓冲图像很浪费资源

您可能想看看如何打印表格

更新

你可以做类似...

public int print(Graphics pg, PageFormat pf, int pageNum) {
    if (page > 0) {
        return NO_SUCH_PAGE;
    }

    Graphics2D g2d = (Graphics2D)pg;

    double pageWidth = pf.getImageableWidth();
    double pageHeight = pf.getImageableHeight();

    double pageX = pf.getImageableX();
    double pageY = pf.getImageableY();

    g2d.translate(pageX, pageY);

    double tableHeight = pageHeight / 2d;

    jPanel1.setBounds(0, 0, (int)Math.floor(pageWidth), (int)Math.floor(pageHeight));
    jPanel1.printAll(g2d);

    return Printable.PAGE_EXISTS;

}

请注意,这可能会截断您的表格。此外,您不应该对Component已经在屏幕上的 a 执行此操作。您应该创建一个新的“打印”组件。

更新工作示例

好的,所以这个概念是合理的,只是需要一些调整才能让它工作;)

在此处输入图像描述

public class PrintTableTest {

    public static void main(String[] args) {

        final JTable table1 = new JTable(new AbstractTableModel() {
            @Override
            public int getRowCount() {
                return 3;
            }

            @Override
            public int getColumnCount() {
                return 3;
            }

            @Override
            public String getColumnName(int column) {
                String name = null;
                switch (column) {
                    case 0:
                        name = "Day";
                        break;
                    case 1:
                        name = "FirstName";
                        break;
                    case 2:
                        name = "LastName";
                        break;
                }
                return name;
            }

            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                Object value = null;
                switch (columnIndex) {
                    case 0:
                        switch (rowIndex) {
                            case 0:
                                value = "First";
                                break;
                            case 1:
                                value = "Second";
                                break;
                            case 2:
                                value = "Final";
                                break;
                        }
                        break;
                }
                return value;
            }
        });
        int rowHeight = (int) Math.floor(((700f / 2f) - table1.getTableHeader().getPreferredSize().height) / 3f);
        table1.setRowHeight(rowHeight);

        PrinterJob printjob = PrinterJob.getPrinterJob();
        printjob.setJobName(" TESSCO CUSTOMER CARD ");

        Printable printable;
        printable = new Printable() {
            public int print(Graphics pg, PageFormat pf, int pageNum) {

                if (pageNum > 0) {
                    return NO_SUCH_PAGE;
                }

                Graphics2D g2d = (Graphics2D) pg;

                double pageWidth = pf.getImageableWidth();
                double pageHeight = pf.getImageableHeight();

                double pageX = pf.getImageableX();
                double pageY = pf.getImageableY();

                g2d.translate(pageX, pageY);

                // Each table will take half the page...
                double tableHeight = pageHeight / 2d;

                // We need to print the header as well...
                JTableHeader header = table1.getTableHeader();
                int headerHeight = header.getPreferredSize().height;

                int yOffset = 0;

                for (int index = 0; index < 2; index++) {
                    // Set the bounds of the components
                    // The yOffset is actuall irrelevent to us, but for consitency sake
                    // we'll keep it.
                    header.setBounds(0, yOffset, (int) Math.floor(pageWidth), headerHeight);
                    table1.setBounds(0, yOffset + headerHeight, (int) Math.floor(pageWidth), (int) Math.floor(tableHeight));
                    // Force the components to update there internal layouts to match
                    // the new size. We need to do this because, technically, we're not
                    // attached to any peer, nor do we want them to be taking into account
                    // the dimensions of any parent any way :P
                    table1.doLayout();
                    header.doLayout();

                    // Translate the graphics.  Components asume a position of 0x0 when
                    // painting.  This is a side effect of the AWT/Swing painting engine
                    // (for which we are greatful), but we need to simulate the change
                    g2d.translate(0, yOffset);
                    header.printAll(g2d);
                    // Translations are relative to the last translation...
                    g2d.translate(0, headerHeight);
                    table1.printAll(g2d);
                    // Reset the last translation
                    g2d.translate(0, -(headerHeight + yOffset));

                    // Next table...
                    yOffset += table1.getHeight();
                }
                return Printable.PAGE_EXISTS;
            }
        };

        Paper paper = new Paper();
        paper.setImageableArea(0, 0, 700, 890);
        paper.setSize(700, 890);

        PageFormat format = new PageFormat();
        format.setPaper(paper);
        format.setOrientation(PageFormat.LANDSCAPE);

//        printjob.setPrintable(printable, format);
        BufferedImage img = new BufferedImage(890, 700, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = img.createGraphics();
        g2d.setColor(Color.WHITE);
        g2d.fill(new Rectangle(0, 0, 890, 700));
        try {
            printable.print(g2d, format, 0);
        } catch (Exception exp) {
            exp.printStackTrace();
        }
        g2d.dispose();

        try {
            ImageIO.write(img, "png", new File("Print.png"));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}
于 2012-09-30T21:39:20.247 回答