在java中打印时如何适应页面的宽度

时间:2015-08-17 20:31:33

标签: java swing

我可以通过此代码使用页脚巧妙地打印任何组件。它的工作很聪明。

public class MultiPagePrintable implements Printable {

    private JComponent component;
    private int lastPage = 0;
    private double yOffset;

    private Font footerFont;

    public MultiPagePrintable(JComponent component) {
        this.component = component;

        footerFont = new Font("Arial", Font.BOLD, 24);
    }

    @Override
    public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
        int result = NO_SUCH_PAGE;

        String name = "I be mighty!";
        String page = Integer.toString(pageIndex);

        FontMetrics fm = graphics.getFontMetrics(footerFont);
        double footerHeight = fm.getHeight() + 4;

        double height = pageFormat.getImageableHeight() - footerHeight;
        component.setSize(component.getPreferredSize());

        if (lastPage != pageIndex) {
            lastPage = pageIndex;
            yOffset = height * pageIndex;
            if (yOffset > component.getHeight()) {
                yOffset = -1;
            }
        }

        if (yOffset >= 0) {
            Graphics2D g2d = (Graphics2D) graphics.create();

            g2d.translate((int) pageFormat.getImageableX(),
                            (int) pageFormat.getImageableY());

            g2d.translate(0, -yOffset);
            component.printAll(g2d);
            g2d.translate(0, +yOffset);
            Shape footerArea = new Rectangle2D.Double(0, height, pageFormat.getImageableWidth(), footerHeight);
            g2d.setColor(Color.WHITE);
            g2d.fill(footerArea);
            g2d.setColor(Color.RED);
            g2d.draw(footerArea);

            g2d.setColor(Color.BLACK);


            g2d.translate(0, (pageFormat.getImageableHeight() - footerHeight));
            float x = 2;
            float y = (float)((footerHeight - fm.getHeight()) / 2d);
            g2d.drawString(name, x, y + fm.getAscent());

            x = (float)(pageFormat.getImageableWidth() - fm.stringWidth(page) - 2);
            g2d.drawString(page, x, y + fm.getAscent());

            g2d.dispose();
            result = PAGE_EXISTS;
        }
        return result;
    }

}

但问题是,它无法扩展组件宽度以适应页面。但是我不想要适应身高。因为此代码已经可以打印多个页面。我需要它。

1 个答案:

答案 0 :(得分:1)

您想要缩放Graphics2D:

g2d.translate(0, -yOffset);
double width = pageFormat.getImageableWidth();
double scale = Math.min(width / component.getWidth(),
                        height / component.getHeight());
if (scale < 1) {
    AffineTransform oldTransform = g2d.getTransform();
    g2d.scale(scale, scale);
    component.printAll(g2d);
    g2d.setTransform(oldTransform);
} else {
    component.printAll(g2d);
}
g2d.translate(0, +yOffset); 

我不确定你的意思&#34;我不想要适应身高&#34;但如果你愿意,你可以随时忽略身高:

g2d.translate(0, -yOffset);
double width = pageFormat.getImageableWidth();
double scale = width / component.getWidth();
if (scale < 1) {
    AffineTransform oldTransform = g2d.getTransform();
    g2d.scale(scale, scale);
    component.printAll(g2d);
    g2d.setTransform(oldTransform);
} else {
    component.printAll(g2d);
}
g2d.translate(0, +yOffset);