java awt 可打印和打印

java awt printable and print

我想打印 canvas 上的内容,发现了这个建议的代码: //https://www.cis.upenn.edu/~bcpierce/courses/629/jdkdocs/guide/awt/designspec/printing.html

PrintJob pjob = getToolkit().getPrintJob(new Frame(), "Print TimeGraph", null);
if(pjob !=null) {
    Graphics pg = pjob.getGraphics();
    if (pg != null) {
        canvas.printAll(pg);
        pg.dispose();   // flush page
    }
        pjob.end();
    }

然后在canvas绘画方法中:

@Override
public void paint(Graphics g) {
    if(g instanceof PrintGraphics){
       if(graphTitle != null){
          g.drawString ("Hello Printer",left+10,top+50);
        } 
    }
}

它打印出来了,但是一些边距被切掉了。我读到 awt.printable 启用了更好的保证金控制,所以我将代码更改为:

PrinterJob pj = PrinterJob.getPrinterJob();
PageFormat pf = pj.defaultPage();
Paper paper = new Paper();
double margin = 4.5; 
paper.setImageableArea(margin, margin, paper.getWidth() - margin * 2, paper.getHeight() - margin * 2);
pf.setPaper(paper);
pj.setPrintable(new MyPrintable(), pf);
if (pj.printDialog()) {
    try {
        pj.print();
    } catch (PrinterException pp) {
        System.out.println(pp);
    }
}

class MyPrintable implements Printable {
    public int print(Graphics g, PageFormat pf, int pageIndex) {
        if (pageIndex != 0)
          return NO_SUCH_PAGE;
    Graphics2D g2 = (Graphics2D) g;
    g2.translate(pf.getImageableX(), pf.getImageableY());
    canvas.printAll(g);
    return PAGE_EXISTS;
    }

}

这就解决了保证金问题。问题是我不再在绘画事件中获得 PrintGraphics 实例。它始终是一个 Graphics 对象,当从打印中调用 paint 时,无法打印其他信息。我尝试在 canvas.printAll 方法中将 Graphics 对象转换为 PrintGraphics 对象,但无济于事。我怎样才能通过检查对象类型或其他方式重新区分所谓的 paint 方法?

也许有点骇人听闻,但在下面的代码行中使用额外参数的间接寻址可能会暂时解决您的问题。

class MyCanvas {
  protected void doPaint(Graphics g, boolean forPrinter) {
    if(forPrinter){
       if(graphTitle != null){
          g.drawString ("Hello Printer",left+10,top+50);
        } 
    }
  }

  @Override
  public void paint(Graphics g) {
    this.doPaint(g, false);
  }
}

class MyPrintable implements Printable {
    public int print(Graphics g, PageFormat pf, int pageIndex) {
      if (pageIndex != 0)
          return NO_SUCH_PAGE;
      Graphics2D g2 = (Graphics2D) g;
      g2.translate(pf.getImageableX(), pf.getImageableY());

      // If on many pages, this will need to be handled better.
      // But as are ignoring the pageIndex, I assume 
      // you are on a single page and pleased to print everything on it
      canvas.doPaint(g, true);
      return PAGE_EXISTS;
    }
}

PS:除非你真的想要一个"composite printable",否则让你MyCanvas自己实现Printable接口会更好。
这意味着:将 public int print(Graphics g, PageFormat pf, int pageIndex) 移动到 MyCanvas class 本身内 - 不会造成伤害,如果您想打印使用 [​​=11=] 非 [=24= 计算的内容,它会有所帮助] 成员。