java awt可打印和打印

时间:2016-10-20 04:28:35

标签: java canvas awt

我想打印画布上的内容并遇到这个建议的代码: //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();
    }

然后在画布绘画方法中:

@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;
    }

}

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

1 个答案:

答案 0 :(得分:0)

或许是hackish但是在下面的代码行中有一个带有额外参数的间接可能会解决你的问题。

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:除非你真的想要一个"复合可打印"让MyCanvas实现Printable接口本身要好得多。
这意味着:移动public int print(Graphics g, PageFormat pf, int pageIndex)类本身内的MyCanvas - 不能伤害它如果您想使用MyCanvas非公开成员打印您计算的内容,则会有所帮助。