我有一个实现Printable的类。在那个类中,我有一个公共方法,它创建一个BufferedImages列表,每个BufferedImages打印在一个页面上。现在我想添加一个PrintDialog,以允许用户选择要打印的页面和要打印的副本数量。
我在网上做了一些研究,发现我可能必须使用Book
类,但我不知道如何在我的情况下使用它。
谁能举个例子?谢谢你的帮助……
ok。下面是我使用的代码:
/**
* Starts the print job
* Allows variable scaling
*/
public void startPrint(float scale, JTable rowHeader, JTable mainTable, boolean includeRowHeaders, boolean includeColumnHeaders) throws PrinterException{
//getPages returns a List<BufferedImage
this.pages = getPages(scale, rowHeader, mainTable, includeRowHeaders, includeColumnHeaders);
this.numberOfPages = this.pages.size();
HashPrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
attr.add(new MediaPrintableArea(0f, 0f, 612/72f, 792/72f, MediaPrintableArea.INCH));
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(this);
job.print(attr);
}
编辑好的。我已经取得了一些进展。现在有新问题了。我现在可以选择页面范围,但是PrintDialog复制JSpinner没有响应,而且无论JSpinner文本字段包含什么,打印方法总是为每个页面调用两次。这是我的代码…
/**
* Starts the print job
* Allows variable scaling
*/
public void startPrint(float scale, JTable rowHeader, JTable mainTable, boolean includeRowHeaders, boolean includeColumnHeaders) throws PrinterException{
//getPages returns a List<BufferedImage>
this.pages = getPages(scale, rowHeader, mainTable, includeRowHeaders, includeColumnHeaders);
this.numberOfPages = this.pages.size();
HashPrintRequestAttributeSet attr = new HashPrintRequestAttributeSet();
attr.add(new JobName("Test Print", null));
attr.add(new MediaPrintableArea(0f, 0f, 612/72f, 792/72f, MediaPrintableArea.INCH));
attr.add(new PageRanges(1, this.numberOfPages));
attr.add(new Copies(1));
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintable(this);
if(job.printDialog(attr)){
job.print(attr);
}
}
/**
* The actual print routine
* Prints the class level List<BufferedImage>
* one after another
*/
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException
{
if (pageIndex > this.numberOfPages - 1){
return NO_SUCH_PAGE;
}
else{
graphics.drawImage(this.pages.get(pageIndex), 0, 0, null);
JOptionPane.showMessageDialog(null, pageIndex);
return PAGE_EXISTS;
}
}
我编辑错了问题。我在微软XPS文档编写器上进行测试。当我把这个项目转移到另一台有真正物理打印机的电脑上时,它工作得很好。