【问题标题】:Printing a number of JPanels打印多个 JPanel
【发布时间】:2012-03-26 13:46:28
【问题描述】:

我刚刚开始学习使用 Java Swing 进行打印,所以如果这个问题非常幼稚,请多多包涵。

我有一个相当复杂的布局,其中包含多个包含 JLabels 的 JPanel 的 JPanel。我想以某种方式在打印机上很好地打印出来。

我知道我可以在表示打印页面的 Graphics2D 对象上“绘画”,但这需要我单独定位每个对象。我希望能够使用 Swing 布局管理器来布局我页面上的项目。一种方法是调用jp.paint(g2d),其中jp 是JPanel,g2d 是表示打印页面的Graphics2D 对象。但是,据我所知,这只会打印一个在屏幕上实际可见的 JPanel。如果 JPanel 不可见,则不会打印。

那么有没有什么方法可以在不首先在计算机屏幕上显示 JPanel 的情况下布局(相当复杂的)JPanel 并将其发送到打印机?

或者我在这里完全走错了路?

【问题讨论】:

  • 不,据我所知,这是关于打印可见对象的。我想打印一个不可见的对象。
  • 当您构建要打印的面板时,执行 pack() 但不要 setVisible(true),面板将打印而不显示在屏幕上。试一试。
  • 我试过了。我以您提到的 URL 中的示例并添加了以下代码:JFrame f2 = new JFrame("xx"); f2.setLayout(new BoxLayout(f2.getContentPane(), BoxLayout.PAGE_AXIS)); f2.add(new JLabel("xxx")); f2.add(new JLabel("yyy")); f2.pack(); 此外,我将要打印的框架从f 更改为f2。输出为空白!然后我添加了f2.setVisible(true),框架打印得很好,但不再是不可见的。

标签: java swing printing


【解决方案1】:

如何在不可见时打印 JPanel 的精简示例。

public class TestPrinterSmall  {
static class JPanelPrintable extends JPanel implements Printable {
    public int print(Graphics g, PageFormat pf, int page) throws PrinterException {
        if (page > 0) return Printable.NO_SUCH_PAGE;
        printAll(g);  
        return Printable.PAGE_EXISTS;
    }
};
private static void printIt(Printable p) throws PrinterException {
    PrinterJob job = PrinterJob.getPrinterJob();
    job.setPrintable(p);
    if (job.printDialog()) job.print();
}    
public static void main(String args[]) throws PrinterException {
    final JFrame f = new JFrame();
    f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    f.setSize(400,400);
    final JPanelPrintable j = new JPanelPrintable(); 
    j.setLayout(new BorderLayout());
    j.add(new JButton("1111"),BorderLayout.NORTH);
    j.add(new JButton("2222"),BorderLayout.SOUTH);            
    f.add(j);f.repaint();f.pack();
    //f.setVisible(true);
    printIt(j);
}
}

输出:

(nothing)

打印机:

【讨论】:

  • 太完美了,查克。我仍然不明白为什么我的代码不起作用,但现在至少我有一些可以使用的东西。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多