日期:2011-03-22 16:16:00 来源:本站整理
java实现打印的实例[Java编程]
本文“java实现打印的实例[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
非常不幸,打印时没有多少事情是可以自动举行的.相反,为完成打印,我们必须阅历大量机械的、非OO(面向对象)的步骤.但打印一个图形化的组件时,大概多少有点儿自动化的意思:默许情形下,print()办法会调用paint()来完成自己的工作.大大都时刻这都已经充足了,但假定还想做一些分外的事情,就必须知道页面的多少尺寸.
下面这个例子同时演示了文字和图形的打印,以及打印图形时可以采纳的差别办法.此外,它也对打印支持举行了测试:
这个程序答应我们从一个挑选列表框中挑选字体(并且我们会注意到很多有效的字体在Java 1.1版中一向遭到严峻的限制,我们没有任何可以操纵的优异字体安装在我们的机械上).它利用这些字体去打出粗体,斜体和差别大小的文字.别的,一个新型组件调用过的画图被成立,以用来示范图形.当打印图形时,画图拥有的ring将显示在屏幕上和打印在纸上,并且这三个衍生类Plot1,Plot2,Plot3用差别的办法去完成任务以便我们可以看到我们挑选的事物.一样,我们也能在一个画图中改变一些ring——这很风趣,因为它证明了Java 1.1版中打印的脆弱.在我的系统里,当ring计数显示“too high”(毕竟这是什么意思?)时,打印机给出错误信息并且不能精确地工作,而当计数给出“low enough”信息时,打印机又能工作得很好.我们也会注意到,当打印到看起来实际大小不符合的纸时页面的大小便产生了.这些特点大概被装入到将来发行的Java中,我们可以利用这个程序来测试它.//: PrintDemo.java // Printing with Java 1.1 import java.awt.*; import java.awt.event.*; public class PrintDemo extends Frame { Button printText = new Button("Print Text"), printGraphics = new Button("Print Graphics"); TextField ringNum = new TextField(3); Choice faces = new Choice(); Graphics g = null; Plot plot = new Plot3(); // Try different plots Toolkit tk = Toolkit.getDefaultToolkit(); public PrintDemo() { ringNum.setText("3"); ringNum.addTextListener(new RingL()); Panel p = new Panel(); p.setLayout(new FlowLayout()); printText.addActionListener(new TBL()); p.add(printText); p.add(new Label("Font:")); p.add(faces); printGraphics.addActionListener(new GBL()); p.add(printGraphics); p.add(new Label("Rings:")); p.add(ringNum); setLayout(new BorderLayout()); add(p, BorderLayout.NORTH); add(plot, BorderLayout.CENTER); String[] fontList = tk.getFontList(); for(int i = 0; i < fontList.length; i++) faces.add(fontList[i]); faces.select("Serif"); } class PrintData { public PrintJob pj; public int pageWidth, pageHeight; PrintData(String jobName) { pj = getToolkit().getPrintJob( PrintDemo.this, jobName, null); if(pj != null) { pageWidth = pj.getPageDimension().width; pageHeight= pj.getPageDimension().height; g = pj.getGraphics(); } } void end() { pj.end(); } } class ChangeFont { private int stringHeight; ChangeFont(String face, int style,int point){ if(g != null) { g.setFont(new Font(face, style, point)); stringHeight = g.getFontMetrics().getHeight(); } } int stringWidth(String s) { return g.getFontMetrics().stringWidth(s); } int stringHeight() { return stringHeight; } } class TBL implements ActionListener { public void actionPerformed(ActionEvent e) { PrintData pd = new PrintData("Print Text Test"); // Null means print job canceled: if(pd == null) return; String s = "PrintDemo"; ChangeFont cf = new ChangeFont( faces.getSelectedItem(), Font.ITALIC,72); g.drawString(s, (pd.pageWidth - cf.stringWidth(s)) / 2, (pd.pageHeight - cf.stringHeight()) / 3); s = "A smaller point size"; cf = new ChangeFont( faces.getSelectedItem(), Font.BOLD, 48); g.drawString(s, (pd.pageWidth - cf.stringWidth(s)) / 2, (int)((pd.pageHeight - cf.stringHeight())/1.5)); g.dispose(); pd.end(); } } class GBL implements ActionListener { public void actionPerformed(ActionEvent e) { PrintData pd = new PrintData("Print Graphics Test"); if(pd == null) return; plot.print(g); g.dispose(); pd.end(); } } class RingL implements TextListener { public void textValueChanged(TextEvent e) { int i = 1; try { i = Integer.parseInt(ringNum.getText()); } catch(NumberFormatException ex) { i = 1; } plot.rings = i; plot.repaint(); } } public static void main(String[] args) { Frame pdemo = new PrintDemo(); pdemo.setTitle("Print Demo"); pdemo.addWindowListener( new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); pdemo.setSize(500, 500); pdemo.setVisible(true); } } class Plot extends Canvas { public int rings = 3; } class Plot1 extends Plot { // Default print() calls paint(): public void paint(Graphics g) { int w = getSize().width; int h = getSize().height; int xc = w / 2; int yc = w / 2; int x = 0, y = 0; for(int i = 0; i < rings; i++) { if(x < xc && y < yc) { g.drawOval(x, y, w, h); x += 10; y += 10; w -= 20; h -= 20; } } } } class Plot2 extends Plot { // To fit the picture to the page, you must // know whether you're printing or painting: public void paint(Graphics g) { int w, h; if(g instanceof PrintGraphics) { PrintJob pj = ((PrintGraphics)g).getPrintJob(); w = pj.getPageDimension().width; h = pj.getPageDimension().height; } else { w = getSize().width; h = getSize().height; } int xc = w / 2; int yc = w / 2; int x = 0, y = 0; for(int i = 0; i < rings; i++) { if(x < xc && y < yc) { g.drawOval(x, y, w, h); x += 10; y += 10; w -= 20; h -= 20; } } } } class Plot3 extends Plot { // Somewhat better. Separate // printing from painting: public void print(Graphics g) { // Assume it's a PrintGraphics object: PrintJob pj = ((PrintGraphics)g).getPrintJob(); int w = pj.getPageDimension().width; int h = pj.getPageDimension().height; doGraphics(g, w, h); } public void paint(Graphics g) { int w = getSize().width; int h = getSize().height; doGraphics(g, w, h); } private void doGraphics( Graphics g, int w, int h) { int xc = w / 2; int yc = w / 2; int x = 0, y = 0; for(int i = 0; i < rings; i++) { if(x < xc && y < yc) { g.drawOval(x, y, w, h); x += 10; y += 10; w -= 20; h -= 20; } } } } ///:~
这个程序为增长反复利用,不管什么时刻都可以封装功效到内部类中.比方,不管什么时刻我想开始打印工作(不管图形或文字),我必须成立一个PrintJob打印工作对象,该对象拥有它自己的连同页面宽度和高度的图形对象.成立的PrintJob打印工作对象和提取的页面尺寸一同被封装进PrintData class打印类中.
1. 打印文字
打印文字的概念简单明了:我们挑选一种字体和大小,决意字符串在页面上存在的位置,并且利用Graphics.drawSrting()办法在页面上画出字符串就行了.这意味着,不管怎样我们必须切确地计算每行字符串在页面上存在的位置并肯定字符串不会超越页面底部大概同别的行冲突.假如我们想举行字处理,我们将举行的工作与我们很相配.ChangeFont封装进少量从一种字体到别的的字体的变更办法并自动地成立一个新字体对象和我们想要的字体,格局(粗体和斜体——目前还不支持下划线、空心等)以及点阵大小.它一样会简单地计算字符串的宽度和高度.当我们按下“Print text”按钮时,TBL接纳器被激活.我们可以注意到它通太反复成立ChangeFont对象和调用drawString()来在计算出的位置打印出字符串.注意能否这些计算产生预期的后果.(我利用的版本没有出错.)
2. 打印图形
按下“Print graphics”按钮时,GBL接纳器会被激活.我们需求打印时,成立的PrintData对象初始化,然后我们简单地为这个组件调用print()打印办法.为强迫打印,我们必须为图形对象调用dispose()处理办法,并且为PrintData对象调用end()完毕办法(或改变成为PrintJob调用end()完毕办法.)
这种工作在画图对象中持续.我们可以看到底子类画图是很简单的——它扩大画布并且包含一此中止调用ring来指明多少个集合的ring需求画在这个特别的画布上.这三个衍生类展示了可到达一个目的的差别的办法:画在屏幕上和打印的页面上.
Plot1采取最简单的编程办法:忽视绘画和打印的差别,并且过载paint()绘画办法.利用这种工作办法的缘由是默许的print()打印办法简单地改变工作办法转而调用Paint().但是,我们会注意到输出的尺寸依靠于屏幕上画布的大小,因为宽度和高度都是在调用Canvas.getSize()办法时决意是,所以这是公道的.假如我们图象的尺寸一值都是固定不变的,别的的情形都可承受.当画出的外观的大小如此的重要时,我们必须深化理解的尺寸大小的重要性.不刚巧的是,就像我们将在Plot2中看到的一样,这种办法变得很棘手.因为一些我们不知道的好的来由,我们不能简单地要求图形对象以它自己的大小画出外观.这将使整个的处理工作变得非常的优异.相反,假如我们打印而不是绘画,我们必须操纵RTTI instanceof关键字(在本书11章中有呼应描写)来测试PrintGrapics,然后下溯造型并调用这独特的PrintGraphics办法:getPrintJob()办法.目前我们拥有PrintJob的句柄并且我们可以发现纸张的高度和宽度.这是一种hacky的办法,但大概这对它来说是公道的来由.(在别的方面,到目前我们看到一些别的的库计划,因此,我们大概会得到计划者们的设法.)
我们可以注意到Plot2中的paint()绘画办法对打印和画图的大概性举行检查.但是因为当打印时Print()办法将被调用,那么为什么不利用那种办法呢?这种办法一样也在Plot3中也被利用,并且它消除了对instanceof利用的需求,因为在Print()办法中我们可以假定我们能对一个PrintGraphics对象造型.这样也不坏.这种情形被安排大众绘画代码到一个体离的doGraphics()办法的办法所改良.
2. 在程序片内运行帧
假如我们想在一个程序片中打印会怎以样呢?很好,为了打印任何事物我们必须通过工具组件对象的getPrintJob()办法拥有一个PrintJob对象,设置唯一的一个帧对象而不是一个程序片对象.于是它仿佛大概从一个利用程序中打印,而不是从一个程序片中打印.但是,它变成我们可以从一个程序片中成立一个帧(相反的到目前为止,我在程序片或利用程序例子中所做的,都可以生成程序片并安设帧.).这是一个很有效的技术,因为它答应我们在程序片中利用一些利用程序(只要它们无阻碍程序片的安全).但是,当利用程序窗口在程序片中呈现时,我们会注意到WEB浏览器插入一些告诫在它上面,此中一些产生“Warning:Applet Window.(告诫:程序片窗口)”的字样.
我们会看到这种技术非常直接的安设一个帧到程序片中.唯一的事是当用户关闭它时我们必须增添帧的代码(替换调用System.exit()):
伴随Java 1.1版的打印支持功效而来的是一些混乱.一些宣扬仿佛声明我们能在一个程序片中打印.但Java的安全系统包含了一个特点,可终止一个正在初始化打印工作的程序片,初始化程序片需求通过一个Web浏览器或程序片浏览器来举行.在写作这本书时,这看起来像留下了一个未定的争议.当我在WEB浏览器中运行这个程序时,printdemo(打印样本)窗口恰好呈现,但它却根本不能从浏览器中打印.//: PrintDemoApplet.java // Creating a Frame from within an Applet import java.applet.*; import java.awt.*; import java.awt.event.*; public class PrintDemoApplet extends Applet { public void init() { Button b = new Button("Run PrintDemo"); b.addActionListener(new PDL()); add(b); } class PDL implements ActionListener { public void actionPerformed(ActionEvent e) { final PrintDemo pd = new PrintDemo(); pd.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e){ pd.dispose(); } }); pd.setSize(500, 500); pd.show(); } } } ///:~
以上是“java实现打印的实例[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |
- ·上一篇文章:java剪贴板操作
- ·下一篇文章:桌面颜色
- ·中查找“java实现打印的实例”更多相关内容
- ·中查找“java实现打印的实例”更多相关内容
评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论