亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? java打印程序設計.txt

?? Java技巧與編程經(jīng)驗談共32個文件
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
 Java打印程序設計 
1 前言
在我們的實際工作中,經(jīng)常需要實現(xiàn)打印功能。但由于歷史原因,Java提供的打印功能一直都比較弱。實際上最初的jdk根本不支持打印,直到jdk1.1才引入了很輕量的打印支持。所以,在以前用Java/Applet/JSP/Servlet設計的程序中,較復雜的打印都是通過調(diào)用ActiveX/OCX控件或者VB/VC程序來實現(xiàn)的,非常麻煩。實際上,SUN公司也一直致力于Java打印功能的完善,而Java2平臺則終于有了一個健壯的打印模式的開端,該打印模式與Java2D圖形包充分結(jié)合成一體。更令人鼓舞的是,新發(fā)布的jdk1.4則提供了一套完整的"Java 打印服務 API" (Java Print Service API),它對已有的打印功能是積極的補充。利用它,我們可以實現(xiàn)大部分實際應用需求,包括打印文字、圖形、文件及打印預覽等等。本文將通過一個具體的程序?qū)嵗齺碚f明如何設計Java打印程序以實現(xiàn)這些功能,并對不同版本的實現(xiàn)方法進行分析比較,希望大家能從中獲取一些有益的提示。
2 Java中的打印
2.1 Java的打印API
Java的打印API主要存在于java.awt.print包中。而jdk1.4新增的類則主要存在于javax.print包及其相應的子包javax.print.event和javax.print.attribute中。其中javax.print包中主要包含打印服務的相關(guān)類,而javax.print.event則包含打印事件的相關(guān)定義,javax.print.attribute則包括打印服務的可用屬性列表等。
2.2 如何實現(xiàn)打印
要產(chǎn)生一個打印,至少需要考慮兩條:
需要一個打印服務對象。這可通過三種方式實現(xiàn):在jdk1.4之前的版本,必須要實現(xiàn)java.awt.print.Printable接口或通過Toolkit.getDefaultToolkit().getPrintJob來獲取打印服務對象;在jdk1.4中則還可以通過javax.print.PrintSerivceLookup來查找定位一個打印服務對象。 
需要開始一個打印工作。這也有幾種實現(xiàn)方法:在jdk1.4之前可以通過java.awt.print.PrintJob(jdk1.1提供的,現(xiàn)在已經(jīng)很少用了)調(diào)用print或printAll方法開始打印工作;也可以通過java.awt.print.PrinterJob的printDialog顯示打印對話框,然后通過print方法開始打印;在jdk1.4中則可以通過javax.print.ServiceUI的printDialog顯示打印對話框,然后調(diào)用print方法開始一個打印工作。 
2.3 打印機對話框
2.3.1 Printable的打印對話框
開始打印工作之前,可以通過PrinterJob.printDialog來顯示一個打印對話框。它給用戶一個機會以選擇應該打印的頁碼范圍,并可供用戶改變打印設置。它是一個本地對話框。
事實上,當從一個Printable對象進行一個打印工作時,打印對象并不知道需要打印多少頁。它只是不停地調(diào)用print方法。只要print方法返回Printable.PAGE_EXISTS值,打印工作就不停地產(chǎn)生打印頁,直到print方法返回Printable.NO_SUCH_PAGE時,打印工作才停止。
由于打印工作只有在打印完成后才進行準確的頁數(shù)計算,所以在對話框上的頁碼范圍是尚未初始化的[1,9999]。我們可以通過構(gòu)建一個java.awt.print.Book對象傳遞給打印對象;也可以通過指定的格式計算需要打印的頁數(shù)并傳遞給打印對象,使其準確地知道要打印多少頁。
2.3.2 ServiceUI的打印對話框
與Printable的對話框不同的是,在jdk1.4提供ServiceUI的打印機對話框的缺省行為已經(jīng)用新的 API 更改了:缺省情況下對話框不顯示。我們必須使用ServiceUI類調(diào)用printDialog方法創(chuàng)建如下所示的打印對話框。
3 Java打印程序設計實例
3.1 打印文本3.1.1 應用場景
假設我們需要打印一個窗體的某個文本編輯域(可能只有幾行,也可能包含多頁)的內(nèi)容,并且每頁最多打印54行,如何實現(xiàn)呢?
3.1.2 解決方法
基本思路如下:首先我們需要實現(xiàn)Printable接口,然后按照每頁最多54行的格式計算共需要打印多少頁,當打印文本的按鈕被點擊時,執(zhí)行相應的打印動作。打印文本的具體操作可通過Graphics2D的drawString方法來實現(xiàn)。
1、實現(xiàn)Printable接口
/*Graphic指明打印的圖形環(huán)境;PageFormat指明打印頁格式(頁面大小以點為計量單位,
1點為1英才的1/72,1英寸為25.4毫米。A4紙大致為595×842點);page指明頁號*/

public int print(Graphics g, PageFormat pf, int page) throws PrinterException{    Graphics2D g2 = (Graphics2D)g;    g2.setPaint(Color.black); //設置打印顏色為黑色	if (page >= PAGES) //當打印頁號大于需要打印的總頁數(shù)時,打印工作結(jié)束		return Printable.NO_SUCH_PAGE;    g2.translate(pf.getImageableX(), pf.getImageableY());//轉(zhuǎn)換坐標,確定打印邊界    drawCurrentPageText(g2, pf, page); //打印當前頁文本return Printable.PAGE_EXISTS; //存在打印頁時,繼續(xù)打印工作}	/*打印指定頁號的具體文本內(nèi)容*/    private void drawCurrentPageText(Graphics2D g2, PageFormat pf, int page)	{		String s = getDrawText(printStr)[page];//獲取當前頁的待打印文本內(nèi)容        //獲取默認字體及相應的尺寸FontRenderContext context = g2.getFontRenderContext();        Font f = area.getFont();        String drawText;        float ascent = 16; 	//給定字符點陣        int k, i = f.getSize(), lines = 0;        while(s.length() > 0 && lines < 54) //每頁限定在54行以內(nèi)        {        	k = s.indexOf('\n'); //獲取每一個回車符的位置            if (k != -1)  //存在回車符            {            	lines += 1; //計算行數(shù)                drawText = s.substring(0, k); //獲取每一行文本                g2.drawString(drawText, 0, ascent); //具體打印每一行文本,同時走紙移位                if (s.substring(k + 1).length() > 0)                {                	s = s.substring(k + 1); //截取尚未打印的文本                    ascent += i;                 }            }            else //不存在回車符            {            	lines += 1; //計算行數(shù)               	drawText = s; //獲取每一行文本                g2.drawString(drawText, 0, ascent); //具體打印每一行文本,同時走紙移位                s = ""; //文本已結(jié)束            }        }    }	/*將打印目標文本按頁存放為字符串數(shù)組*/	public String[] getDrawText(String s)    {        String[] drawText = new String[PAGES];//根據(jù)頁數(shù)初始化數(shù)組        for (int i = 0; i < PAGES; i++)            drawText[i] = ""; //數(shù)組元素初始化為空字符串		        int k, suffix = 0, lines = 0;        while(s.length() > 0)        {            if(lines < 54) //不夠一頁時            {                k = s.indexOf('\n');                if (k != -1) //存在回車符                {                    lines += 1; //行數(shù)累加					//計算該頁的具體文本內(nèi)容,存放到相應下標的數(shù)組元素                    drawText[suffix] = drawText[suffix] + s.substring(0, k + 1);                    if (s.substring(k + 1).length() > 0)                        s = s.substring(k + 1);                }                else                {                    lines += 1; //行數(shù)累加					//將文本內(nèi)容存放到相應的數(shù)組元素                    drawText[suffix] = drawText[suffix] + s;                     s = "";                }            }            else //已滿一頁時            {                lines = 0; //行數(shù)統(tǒng)計清零                suffix++; //數(shù)組下標加1            }        }        return drawText;    }

2、計算需要打印的總頁數(shù)
    public int getPagesCount(String curStr)	{        int page = 0;        int position, count = 0;        String str = curStr;	    while(str.length() > 0) //文本尚未計算完畢	    {	        position = str.indexOf('\n'); //計算回車符的位置            count += 1; //統(tǒng)計行數(shù)	        if (position != -1)                str = str.substring(position + 1); //截取尚未計算的文本	        else	            str = ""; //文本已計算完畢	    }	    if (count > 0)	        page = count / 54 + 1; //以總行數(shù)除以54獲取總頁數(shù)        return page; //返回需打印的總頁數(shù)	}
3.1、以jdk1.4以前的版本實現(xiàn)打印動作按鈕監(jiān)聽,并完成具體的打印操作
	private void printTextAction()    {        printStr = area.getText().trim(); //獲取需要打印的目標文本        if (printStr != null && printStr.length() > 0) //當打印內(nèi)容不為空時        {            PAGES = getPagesCount(printStr); //獲取打印總頁數(shù)            PrinterJob myPrtJob = PrinterJob.getPrinterJob(); //獲取默認打印作業(yè)            PageFormat pageFormat = myPrtJob.defaultPage(); //獲取默認打印頁面格式            myPrtJob.setPrintable(this, pageFormat); //設置打印工作            if (myPrtJob.printDialog()) //顯示打印對話框            {                try                {                    myPrtJob.print(); //進行每一頁的具體打印操作                }                catch(PrinterException pe)                {                    pe.printStackTrace();                }            }        }        else        {            //如果打印內(nèi)容為空時,提示用戶打印將取消            JOptionPane.showConfirmDialog(null,               "Sorry, Printer Job is Empty, Print Cancelled!", "Empty", 	     JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE);        }    }
3.2、以jdk1.4新版本提供的API實現(xiàn)打印動作按鈕監(jiān)聽,并完成具體的打印操作

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区中文字幕| 91精品中文字幕一区二区三区| 欧洲激情一区二区| 久久色在线视频| 亚洲精品第一国产综合野| 麻豆国产91在线播放| 欧美影院午夜播放| 国产精品久久久久久久第一福利 | 精品乱人伦小说| 亚洲gay无套男同| 成人av电影在线网| 国产欧美精品在线观看| 免费在线看一区| 欧美日韩电影一区| 一区二区三区在线看| 99精品偷自拍| 国产精品嫩草影院av蜜臀| 国产在线国偷精品免费看| 欧美一区二区三区性视频| 亚洲国产一区视频| 一本大道久久精品懂色aⅴ| 中文一区二区完整视频在线观看| 蜜桃av噜噜一区二区三区小说| 欧洲人成人精品| 亚洲国产日日夜夜| 色综合天天综合网国产成人综合天| 精品国产一区二区三区久久久蜜月 | 一区二区久久久| 97精品国产露脸对白| 国产精品视频免费看| 国产一区二区调教| 久久综合丝袜日本网| 精一区二区三区| 精品欧美一区二区三区精品久久| 日韩专区一卡二卡| 欧美美女网站色| 爽爽淫人综合网网站| 欧美日本视频在线| 久久精品久久精品| 久久色成人在线| 成人三级在线视频| 综合久久久久久| 欧美色网一区二区| 视频在线观看一区| 精品电影一区二区三区| 国产一区二区三区| 日本一区二区动态图| 粉嫩13p一区二区三区| 亚洲色图另类专区| 在线这里只有精品| 奇米综合一区二区三区精品视频 | 日韩亚洲欧美在线观看| 免费成人小视频| 国产婷婷色一区二区三区在线| 成人中文字幕在线| 亚洲国产cao| 日韩欧美高清一区| av亚洲产国偷v产偷v自拍| 日韩中文欧美在线| 26uuu久久综合| 91在线你懂得| 男人的j进女人的j一区| 国产欧美日韩在线视频| 色综合久久精品| 视频一区二区欧美| 久久九九久精品国产免费直播| 成人性视频网站| 天天综合天天综合色| 久久久亚洲午夜电影| 在线观看日韩毛片| 国产一区二区三区免费| 亚洲精选免费视频| 精品国产百合女同互慰| 91视频免费播放| 久久国产夜色精品鲁鲁99| 国产精品人成在线观看免费| 欧美日韩久久一区| 国产成人丝袜美腿| 日韩av不卡一区二区| 亚洲私人影院在线观看| 欧美电视剧在线观看完整版| 91在线视频官网| 国产乱对白刺激视频不卡| 亚洲福利视频三区| 国产精品美女久久福利网站| 91.麻豆视频| 91浏览器在线视频| 国产成人一区在线| 麻豆91在线播放| 午夜精品久久久久| 亚洲人成精品久久久久久| 精品国产自在久精品国产| 欧美网站大全在线观看| 国产精品888| 精彩视频一区二区| 午夜精品久久久久久久久久久| 日本一区二区免费在线观看视频| 91麻豆精品国产91久久久| 色偷偷成人一区二区三区91| 国产精品亚洲一区二区三区妖精| 日韩国产欧美在线播放| 亚洲国产婷婷综合在线精品| 国产精品伦一区二区三级视频| 欧美成人一区二区三区在线观看 | ww亚洲ww在线观看国产| 日韩欧美一二三四区| 欧美日韩中文另类| 在线视频亚洲一区| 91激情在线视频| 色8久久精品久久久久久蜜| 成人深夜视频在线观看| 国产成人aaa| 成人性生交大片免费看视频在线| 久久99热狠狠色一区二区| 欧美a一区二区| 日本怡春院一区二区| 日本欧美韩国一区三区| 午夜电影久久久| 蜜臀久久99精品久久久画质超高清| 亚洲国产综合视频在线观看| 亚洲一卡二卡三卡四卡 | 亚洲欧洲色图综合| 国产精品萝li| 亚洲人成网站精品片在线观看| 最新欧美精品一区二区三区| 国产精品久久久久久久午夜片| 国产精品久久久久久久久免费相片| 国产精品国产三级国产普通话99| 国产女人水真多18毛片18精品视频| 国产午夜精品在线观看| 国产精品免费视频观看| 亚洲手机成人高清视频| 亚洲码国产岛国毛片在线| 一区二区三区在线视频免费观看| 亚洲成人一区二区| 久久国产成人午夜av影院| 国内一区二区在线| 99re在线精品| 欧美巨大另类极品videosbest| 欧美一级一区二区| 国产欧美精品一区aⅴ影院 | 色94色欧美sute亚洲13| 欧美日韩精品一区视频| 久久一二三国产| 中文字幕一区二区三区视频| 亚洲国产一区二区在线播放| 日本美女一区二区三区| 国产精品自拍网站| 欧美私人免费视频| 精品欧美黑人一区二区三区| 中文字幕国产精品一区二区| 亚洲综合另类小说| 国产精品一区二区男女羞羞无遮挡 | 亚洲天堂av老司机| 蜜臀av一区二区在线观看 | 国产曰批免费观看久久久| 99国产精品国产精品毛片| 91精品在线麻豆| 中文字幕在线播放不卡一区| 午夜成人在线视频| 成人av在线播放网址| 日韩视频在线你懂得| 亚洲色图视频免费播放| 看电影不卡的网站| 91福利国产成人精品照片| 精品欧美一区二区三区精品久久 | 欧美日韩中文精品| 欧美激情一区三区| 日本中文一区二区三区| 91在线观看污| 久久嫩草精品久久久精品| 亚洲va天堂va国产va久| 成人av免费在线播放| 26uuu久久天堂性欧美| 午夜精品一区二区三区免费视频| 东方欧美亚洲色图在线| 欧美一区二区三区四区五区| 亚洲精品欧美综合四区| 国产美女在线观看一区| 欧美一级精品在线| 亚洲一卡二卡三卡四卡无卡久久 | 国产乱码一区二区三区| 欧美日韩一区二区三区四区五区| 国产精品福利av| 国产成人精品在线看| 26uuu另类欧美| 蜜臀久久久99精品久久久久久| 色哟哟欧美精品| 综合在线观看色| 成人短视频下载| 国产农村妇女毛片精品久久麻豆 | 久久av老司机精品网站导航| 欧美美女bb生活片| 亚洲123区在线观看| 欧美色窝79yyyycom| 亚洲一区二区视频在线观看| 一本大道久久a久久精二百| 综合激情成人伊人| 99视频一区二区| 亚洲视频1区2区|