【发布时间】:2017-03-01 22:13:47
【问题描述】:
我想打印画布上的内容,结果发现了以下建议代码: //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 对象,当从打印中调用绘制时,无法打印其他信息。我尝试将 Graphics 对象转换为 canvas.printAll 方法中的 PrintGraphics 对象,但无济于事。如何通过检查对象类型或通过其他方式重新获得区分所谓的绘制方法的能力?
【问题讨论】: