首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的可打印Swing组件的所有部分都不打印

我的可打印Swing组件的所有部分都不打印
EN

Stack Overflow用户
提问于 2010-05-19 11:26:32
回答 1查看 2.2K关注 0票数 1

我正在尝试做一个可打印的组件(发票文档)。我使用JComponent而不是JPanel,因为我不想要背景。该组件有许多子组件。

主组件实现可打印,并具有一个调用print-method的printAll(g),以便打印所有子组件。但我的子组件不打印。

我遗漏了什么?所有子组件也必须实现可打印吗?

在下面的代码中,没有打印TopHeader

代码语言:javascript
复制
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class PPanel extends JComponent implements Printable {
    static double w;
    static double h;

    public PPanel() {
        this.setLayout(new BorderLayout());

        this.add(new JLabel("Document Body"), BorderLayout.CENTER);
        this.add(new TopHeader(), BorderLayout.NORTH);
    }

    class TopHeader extends JComponent {
        public TopHeader() {
            this.setLayout(new BorderLayout());
            JLabel companyName = new JLabel("Company name");
            JLabel docType = new JLabel("Document type");
            this.add(companyName, BorderLayout.WEST);
            this.add(docType, BorderLayout.EAST);
        }
    }

    public static void main(String[] args) {
        final PPanel p = new PPanel();
        PrinterJob job = PrinterJob.getPrinterJob();
        job.setPrintable(p);
        try {
            job.print();
        } catch (PrinterException ex) {
            // print failed
        }
            // Preview
        new JFrame() {{ getContentPane().add(p); this.setSize((int)w, (int)h); setVisible(true); }};

    }

    @Override
    public int print(Graphics g, PageFormat pf, int page)
            throws PrinterException {
        if (page > 0) {
            return NO_SUCH_PAGE;
        }

        Graphics2D g2d = (Graphics2D)g;
        g2d.translate(pf.getImageableX(), pf.getImageableY());

        w = pf.getImageableWidth();
        h = pf.getHeight();

        this.setSize((int)w, (int)h);
        this.setPreferredSize(new Dimension((int)w, (int)h));
        this.doLayout();

        this.printAll(g);
        return PAGE_EXISTS;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-05-19 15:58:59

您可能可以遍历由Component[]返回的getComponents(),但是下面显示了一个简单的权宜之计。注意屏幕预览和打印输出之间的区别。另外,注意validate()的使用优先于doLayout()。最后,为了方便预览,本例实现了。

增编:您也可以看看,比较一下在这个example中采用的方法。

代码语言:javascript
复制
import java.awt.*;
import java.awt.print.*;
import javax.swing.*;

public class PPanel extends JComponent implements Printable {

    private JComponent top = new TopHeader();
    private JComponent mid = new JLabel("Document Body");

    public PPanel() {
        this.setLayout(new BorderLayout());
        this.add(top, BorderLayout.NORTH);
        this.add(mid, BorderLayout.CENTER);
    }

    private static class TopHeader extends JComponent {

        public TopHeader() {
            this.setLayout(new BorderLayout());
            JLabel companyName = new JLabel("Company name");
            JLabel docType = new JLabel("Document type");
            this.add(companyName, BorderLayout.WEST);
            this.add(docType, BorderLayout.EAST);
        }
    }

    @Override
    public int print(Graphics g, PageFormat pf, int page)
        throws PrinterException {
        if (page > 0) {
            return NO_SUCH_PAGE;
        }
        Graphics2D g2d = (Graphics2D)g;
        g2d.translate(pf.getImageableX(), pf.getImageableY());
        int w = (int)pf.getImageableWidth();
        int h = (int)pf.getImageableHeight();
        top.setSize(new Dimension(w, top.getPreferredSize().height));
        this.setSize(w, h);
        this.validate();
        this.printAll(g2d);
        return PAGE_EXISTS;
    }

    public static void main(String[] args) {
        final PPanel p = new PPanel();
        // Preview before print()
        new JFrame() {
            {
                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                this.add(p);
                this.pack();
                this.setVisible(true);
            }
        };
        PrinterJob pj = PrinterJob.getPrinterJob();
        PageFormat pf = pj.pageDialog(pj.defaultPage());
        pj.setPrintable(p, pf);
        if (pj.printDialog()) {
            try {
                pj.print();
            } catch (PrinterException pe) {
                pe.printStackTrace();
            }
        }
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2865009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档