Java 使用Swing打印多页
我正在写一个程序,将我的文本区域与已经生成的数据一起打印出来。我让它计算出打印整个文本区域需要多少页,但它不是打印第1页,然后打印第2页,而是打印第1页,然后再打印第1页。我似乎无法用它来拯救我的生命。我已经浏览了所有关于oracle的论坛和帮助,但一定有我遗漏的东西。如果您能如此友好,花一分钟看看我的代码,我将非常感激。谢谢-加勒特Java 使用Swing打印多页,java,swing,printing,textarea,jtextarea,Java,Swing,Printing,Textarea,Jtextarea,我正在写一个程序,将我的文本区域与已经生成的数据一起打印出来。我让它计算出打印整个文本区域需要多少页,但它不是打印第1页,然后打印第2页,而是打印第1页,然后再打印第1页。我似乎无法用它来拯救我的生命。我已经浏览了所有关于oracle的论坛和帮助,但一定有我遗漏的东西。如果您能如此友好,花一分钟看看我的代码,我将非常感激。谢谢-加勒特 private void hardPrintActionPerformed(java.awt.event.ActionEvent evt) {
private void hardPrintActionPerformed(java.awt.event.ActionEvent evt)
{
int width = printOut.getWidth() ;
int height = printOut.getHeight();
System.out.println("width is "+ width);
System.out.println("Height is "+height);
String font = fontSize.getText();
int FontS = Integer.parseInt(font);
Font fonT = new Font("Monospaced", Font.PLAIN, 12);
printOut.setFont(new Font("Tahoma", Font.PLAIN, FontS));
PrinterJob pj = PrinterJob.getPrinterJob();
PageFormat pf = pj.defaultPage();
Book bk = new Book();
Paper paper = new Paper();
double margin = 18;
pj.setPageable(bk);
paper.setSize(612,792);
paper.setImageableArea(margin, margin
, paper.getWidth() -margin * 2
, paper.getHeight() - margin * 2);
int lines = printOut.getLineCount();
System.out.println("lines = "+lines);
pf.setPaper(paper);
int tall = (int) pf.getImageableHeight();
System.out.println("tall ="+tall);
System.out.println("orientation "+pf.getOrientation());
int pagenum =bk.getNumberOfPages();
System.out.println("pagenum = "+pagenum);
System.out.println("areah = "+height);
int numpages =1;
if (height >756) {
for (int i = 756; i < height;) {
numpages = numpages+1;
i= i +756;
}
}
System.out.println("numpages ="+numpages);
bk.append(new MyPrintable(), pf,numpages);
// pj.setPrintable(new MyPrintable(), pf);
if (pj.printDialog()) {
try {
printOut.setBounds(0, 0, printOut.getWidth(), printOut.getHeight());
pj.print();
} catch (PrinterException pp) {
System.out.println(pp);
}
}
}
/**
* @param args the command line arguments
*/
class MyPrintable implements Printable {
public int print(Graphics g, PageFormat pf, int pageIndex) {
//int pagenum =bk.getNumberOfPages();
int height = printOut.getHeight();
int numpages =1;
if (height >756) {
for (int i = 756; i < height;) {
numpages = numpages+1;
i= i +756;
}
}
if (pageIndex >3)
return NO_SUCH_PAGE;
else{
Graphics2D g2 = (Graphics2D) g;
g2.setFont(new Font("Monospaced", Font.PLAIN, 10));
printOut.setBounds(0, 0, printOut.getWidth(), printOut.getHeight());
// paper.getImageableWidth();
g2.translate(pf.getImageableX(), pf.getImageableY());
System.out.println("print " +pf.getImageableY());
Rectangle componentBounds = printOut.getBounds();
g2.translate(-componentBounds.x, -componentBounds.y);
g2.scale(1, 1);
boolean wasBuffered = printOut.isDoubleBuffered();
printOut.printAll(g2); //printOut is my text area.
printOut.setDoubleBuffered(wasBuffered);
return PAGE_EXISTS;
}
}
}
private void hardPrintActionPerformed(java.awt.event.ActionEvent evt)
{
int width=printOut.getWidth();
int height=printOut.getHeight();
System.out.println(“宽度为”+宽度);
System.out.println(“高度为”+高度);
字符串font=fontSize.getText();
int FontS=Integer.parseInt(字体);
Font Font=新字体(“等距”,Font.PLAIN,12);
setFont(新字体(“Tahoma”,Font.PLAIN,Font));
PrinterJob pj=PrinterJob.getPrinterJob();
PageFormat pf=pj.defaultPage();
Book bk=新书();
纸张=新纸张();
双边际=18;
pj.可设置页面(bk);
纸张尺寸(612792);
纸张.可设置图像区域(边距,边距
,paper.getWidth()-页边距*2
,paper.getHeight()-页边距*2);
int lines=printOut.getLineCount();
System.out.println(“行=”+行);
设定纸(纸);
int-tall=(int)pf.getImageableHeight();
System.out.println(“高=”+高);
System.out.println(“方向”+pf.getOrientation());
int pagenum=bk.getNumberOfPages();
System.out.println(“pagenum=“+pagenum”);
System.out.println(“areah=“+高度”);
int numpages=1;
如果(高度>756){
对于(int i=756;i756){
对于(int i=756;i3)
不返回此类页面;
否则{
图形2d g2=(图形2d)g;
g2.setFont(新字体(“等距”,Font.PLAIN,10));
setBounds(0,0,printOut.getWidth(),printOut.getHeight());
//paper.getImageableWidth();
g2.translate(pf.getImageableX(),pf.getImageableY());
System.out.println(“print”+pf.getImageable());
矩形组件边界=printOut.getBounds();
g2.translate(-componentBounds.x,-componentBounds.y);
g2.量表(1,1);
布尔值wasbuffer=printOut.isDoubleBuffered();
printOut.printAll(g2);//printOut是我的文本区域。
打印输出。setDoubleBuffered(wasBuffered);
返回页面_存在;
}
}
}
你真的需要使用printJob吗?为什么不使用JasperReports来制作你的pdf(另外,你有一个制作pdf、xls和许多其他格式的库),你不能在IReports中设计然后与jasper一起使用,或者从代码设计报告,非常有效的工具:D你需要使用g2.translate(-componentBounds.x,-componentBounds.y);
使用Java Ranch和Java论坛上交叉发布的
pageIndex*pageHeight
更正Y