高分急求答案,关于打印的。500(100分)

  • 主题发起人 guangmin
  • 开始时间
G

guangmin

Unregistered / Unconfirmed
GUEST, unregistred user!
我用写的打印程序,预览时为横排(LANDSCAPE),但是打印出来就是竖排(PORTRAIT)
我知道一定是某个小问题造成的,那个搞过打印的高人能告诉我,重谢!!!1
 
电脑打印机的设置
 
手动设置也不行。。
 
请将具体的坏境、程序告之
 
jbuilder 3,windows NT
程序很长。只能截一段
//---------------------------------------------------------------------
public void printGroup(File file,Font font)
{
try { SAXBuilder builder=new SAXBuilder(false);
do
cumentdo
c=builder.build(file);
Element root=doc.getRootElement();
java.util.List invoice=root.getChildren("INVOICE");
Iterator i=invoice.iterator();
while (i.hasNext())
{ Element invo=(Element)i.next();
tab(60);
print(invo.getChild("INVOICE_NO").getText(),font);
println();
tab(60);
print(invo.getChild("INVOICE_DATE").getText(),font);
println();
tab(60);
print(invo.getChild("ACCOUNT_NO").getText(),font);
println();
println();
tab(0);
print(invo.getChild("INVOICE_TO").getText(),font);
tab(30);
print(invo.getChild("OUR_ORDER_NO").getText(),font);
tab(10);
print(invo.getChild("YOUR_NUMBER").getText(),font);
tab(55);
print(invo.getChild("SHIP_TO").getText(),font);
println();
println();
println();
println();
println();
println();
tab(0);
print(invo.getChild("PRODUCT_CODE").getText(),font);
tab(15);
print(invo.getChild("SERIAL_NO").getText(),font);
tab(35);
print(invo.getChild("QTY").getText(),font);
tab(50);
print(invo.getChild("LIST_PRICE").getText(),font);
tab(60);
print(invo.getChild("DISC").getText(),font);
tab(70);
print(invo.getChild("NETT_PRICE").getText(),font);
tab(75);
print(invo.getChild("NETT_VALUE").getText(),font);
println();
print(invo.getChild("REMARK").getText(),font);
for (int j=0;j<=6;j++) println();
print(invo.getChild("TOTAL_VALUE").getText(),font);
println();
println();
print(invo.getChild("VAT").getText(),font);
println();
println();
print(invo.getChild("TOTAL_DUE").getText(),font);
}
}
catch (Exception e) {e.printStackTrace();}
}
 
这是生成数据的代码,不是打印的代码
 
你在控件或代码里面查过吗?
 
把你的代碼堅著寫,不要橫寫,不就OK
 
这样写也不行!
public int print(Graphics g,PageFormat pf,int page)throws PrinterException
{
Graphics2D g2=(Graphics2D)g;
g2.setPaint(Color.black);
pf.setOrientation(PageFormat.LANDSCAPE);
g2.translate(pf.getImageableX(),pf.getImageableY());
// if (str.equals("Preview"))drawCropMarks(g2,pf);
g2.clip(new Rectangle2D.Double(0,0,pf.getImageableWidth(),pf.getImageableHeight()));
g2.translate(0,-page*pf.getImageableHeight());
// int pages=getPageCount(g2,pf);
for (int i=0;i<=17;i++) drawString(g,item,setLocation,width);
return Printable.PAGE_EXISTS;
}
public void drawString(Graphics g,String st,Point p,double width)
{ wid=width;
int POINTS_PER_INCH = 72;
Graphics2D g2d = (Graphics2D) g;
TextLayout layout;
AttributedString paragraphText = new AttributedString (st);
Point2D.Double pen = new Point2D.Double (0.25 * POINTS_PER_INCH, 0.25 * POINTS_PER_INCH);
//--- Translate the origin to 0,0 for the top left corner

//--- Set the font for this text
paragraphText.addAttribute (TextAttribute.FONT, new Font ("serif", Font.PLAIN, 10));
LineBreakMeasurer lineBreaker = new LineBreakMeasurer (paragraphText.getIterator(),
new FontRenderContext (null, true, true));
//--- LineBreakMeasurer will wrap each line to correct length and
//--- return it as a TextLayout object
int first = 0;
while ((layout = lineBreaker.nextLayout ((float) wid)) != null)
{ //--- Align the Y pen to the ascend of the font, remember that
//--- the ascend is origin (0, 0) of a font. Refer to figure 1
if ( first == 0 )
{ pen.y += layout.getAscent () + (float)p.y;
pen.x += layout.getAscent () + (float)p.x;
first = -1;
}
else
{ pen.y += layout.getAscent ();
//pen.x += layout.getAscent () + (float)p.x;
}
//--- Draw the line of text
layout.draw (g2d, (float) pen.x, (float) pen.y);
//--- Move the pen to the next position adding the descent and
//--- the leading of the font
pen.y += layout.getDescent () + layout.getLeading ();
// g.setFont(oldFont);
}
}
}
 
check your print!
I am sure It is print contral problem
 
这个问题其实是因为jdk本身的问题,建议你用jdk1.3绝对搞定
 
是不是你的系统打印属性设置成了横向的了?!!
随便说说,不要生气!
 
谨表同情,你的jdk版本的问题,jdk1.2的某个版本有bug,你换成1.3保证没问题。
我曾经困扰了整整两个月啊!!!
 
Java 打印
1.Java 2 Printing Api
对一个GUI程序来说,打印和打印预览是现在大多数程序都要实现的功能。
在Java2之前,显然设计者们做的不太好。
但Java2 之后大为改观。先介绍一下Java2提供的与打印有关的API.
1.1 PrintJob

class java.awt.print.PrinterJob
这个类是Java2中控制打印的最主要的一个类。
一个典型的打印过程如下:
PrinterJob prnJob=PrinterJob.getPrinterJob();
//返回一个PrintJob实例
prnJob.setPrintable(myPrintable);
//设置PrintJob的可打印对象
if(!prnJob.printDialog()) //显示一个与平台有关的打印dialog.
// 比如在windows里就是大家熟悉的一个
// PrintDialog有OK,Cancel的button,还有设置打印范围的
//文本框等。如果按了Cancel,则返回false.不打印
return;
prnJob.print();//否则,调用print方法,进行打印。

其中的可打印对象是一个实现了Printable 接口的对象。
凡是希望打印的对象都要实现此接口。
1.2 Printable 接口.
abstract interface java.awt.print.Printable
该接口只定义了一个方法:print,
有三个参数:
Graphics graphics:类似于VC中的CDC,即设备环境,graphics context
注意:这个graphics 可以在 print方法中转换为Graphics2D对象。
就可以利用最新的2D功能
PageFormat pageFormat: 关于页格式的一个对象。由此对象可以得到或设置
页的可打印范围,打印方向等等。
int pageIndex:将要打印的页的编号,由零开始。
print 方法的返回值有两个: PAGE_EXISTS 当本页成功打印
NO_SUCH_PAGE 当index太大或不存在本页。
我们自己不用去调用一个Printable对象的Print方法。而是由PrintJob的print
方法调用它。另外,在打印的时候,如果指定是从第三页到第五页,Java也会先将
第一,二页render一遍只是不打出来。

而且,在render之前(即print方法被调用之前),打印系统和java之间没有方法
进行通讯以确切知道总共会有多少页被打印。这就是为什么经常在Java做的打印
程序里看到打印对话框Range中from 1 to 99999的原因。如果用Printable接口来
实现的话,这个问题是避免不了的。包括sun的Forte for java 2.0的打印都是
如此哦。要想避免此问题只有实现Pagealbe 接口。

 
多人接受答案了。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
933
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
顶部