無(wú)論采用哪種語(yǔ)言來(lái)開(kāi)發(fā)應(yīng)用系統(tǒng),打印功能總是少不了的。為了節(jié)省Java程序開(kāi)發(fā)人員的工作量,在Java語(yǔ)言中專(zhuān)門(mén)提供了一個(gè)PrinterJob類(lèi)來(lái)幫助開(kāi)發(fā)人員實(shí)現(xiàn)打印控制的功能。
本文將給大家介紹一下如何使用PrintJob類(lèi)來(lái)實(shí)現(xiàn)打印作業(yè)。
一、PrinterJob類(lèi)的功能。
在Java語(yǔ)言中,實(shí)現(xiàn)打印控制的類(lèi)也很多。但是筆者比較傾向于使用這個(gè)PrintJob類(lèi)。它是在Java語(yǔ)言中控制打印作業(yè)的主要類(lèi)。開(kāi)發(fā)人員在編寫(xiě)代碼的時(shí)候,可以調(diào)用這個(gè)類(lèi)中的方法來(lái)完成一些打印功能。如實(shí)現(xiàn)設(shè)置添加打印任務(wù)、打開(kāi)打印對(duì)話(huà)框、執(zhí)行頁(yè)面打印等等作業(yè)。一般來(lái)說(shuō),通過(guò)這個(gè)類(lèi)就可以實(shí)現(xiàn)大部分的打印作業(yè)。不過(guò)需要注意的是,這個(gè)類(lèi)是用來(lái)實(shí)現(xiàn)一些普通的打印功能。如果涉及到比較特殊的打印指令,雖然通過(guò)方法重構(gòu)等手段也可以實(shí)現(xiàn),但是比較復(fù)雜。在Java語(yǔ)言(Java語(yǔ)言中定義常量注意事項(xiàng)解析)中針對(duì)特殊的打印選項(xiàng),也有一些對(duì)應(yīng)的類(lèi)。所以在開(kāi)發(fā)打印功能的時(shí)候,這個(gè)PrinterJob類(lèi)是最基礎(chǔ)的類(lèi)。在了解了這個(gè)類(lèi)之后,再去適當(dāng)了解其他的一些特殊的打印類(lèi)。如此的話(huà),程序開(kāi)發(fā)人員才能夠以最少的代碼、最少的時(shí)間來(lái)實(shí)現(xiàn)比較復(fù)雜的打印控制。特別是用戶(hù)有一些比較特殊的打印需求時(shí),結(jié)合其他的類(lèi)可以達(dá)到事半功倍的效果。如果從零開(kāi)始來(lái)開(kāi)發(fā)新方法,那是得不償失了。程序開(kāi)發(fā)人員即使不能夠記住Java語(yǔ)言中所有的打印類(lèi),也必須要對(duì)他們有一個(gè)大概的印象。至少當(dāng)用戶(hù)提出某個(gè)打印需求時(shí),需要知道在Java語(yǔ)言的類(lèi)中是否有與之相對(duì)應(yīng)的類(lèi)。然后再通過(guò)查詢(xún)相關(guān)的資料來(lái)調(diào)用這個(gè)類(lèi)。(子類(lèi)如何青處于藍(lán)而勝于藍(lán))
二、使用PrintJob對(duì)象。
跟其他類(lèi)一樣,如果需要使用這個(gè)PrintJob類(lèi)的話(huà),則需要先利用這個(gè)類(lèi)來(lái)創(chuàng)建打印對(duì)象。不過(guò)程序開(kāi)發(fā)人員需要注意的是,這個(gè)PrintJob類(lèi)采用的是單例模式,也就是說(shuō),他必須通過(guò)靜態(tài)方法來(lái)獲取唯一的實(shí)例。如一般情況下,我們程序開(kāi)發(fā)人員可以采用如下的語(yǔ)句來(lái)創(chuàng)建對(duì)象:PrintJob pjob=PringJob.getPrinterJob()。一但執(zhí)行這條語(yǔ)句,就會(huì)創(chuàng)建PringJob類(lèi)的實(shí)例對(duì)象。注意這個(gè)方法必須是靜態(tài)的。當(dāng)這個(gè)實(shí)例對(duì)象創(chuàng)建之后,在程序中這個(gè)對(duì)象就是唯一的。在其他模塊或者以后需要再次調(diào)用這個(gè)方法時(shí),就可以直接引用這個(gè)對(duì)象的方法,而不需要再次創(chuàng)建。這就是靜態(tài)方法所帶來(lái)的好處。由于各個(gè)模塊采用相同的打印方法,這也會(huì)后續(xù)的打印隊(duì)列等功能提供了實(shí)現(xiàn)了可能性。#p#副標(biāo)題#e#
三、調(diào)用PringJob對(duì)象的常見(jiàn)方法。
在PringJob類(lèi)中,定義了很多的方法,如設(shè)置打印任務(wù)名稱(chēng)、設(shè)置打印頁(yè)面、追蹤打印狀態(tài)等等。所以作為Java程序開(kāi)發(fā)人員是一件很開(kāi)心的事情。因?yàn)樵陂_(kāi)發(fā)打印功能的時(shí)候,基本上只需要直接引用類(lèi)中的方法即可,而很少需要重新開(kāi)發(fā)新的功能。
當(dāng)有多個(gè)文檔在打印的時(shí)候,在打印窗口可以看到有多個(gè)待打印的文檔在排隊(duì)。這是通過(guò)setJobName方法來(lái)實(shí)現(xiàn)的。PrinterJob類(lèi)可以調(diào)用訪問(wèn)打印任務(wù)名稱(chēng)的屬性,這個(gè)屬性就是現(xiàn)實(shí)在打印任務(wù)列表中的相關(guān)打印任務(wù)。在這個(gè)類(lèi)中,設(shè)置打印任務(wù)主要是通過(guò)setJobName方法來(lái)實(shí)現(xiàn)的。這個(gè)方法會(huì)接收String類(lèi)型的字符串作為其參數(shù),然后會(huì)利用這個(gè)參數(shù)的值作為打印任務(wù)的名稱(chēng)。不過(guò)這個(gè)方法只是在打印窗口中顯示打印的名稱(chēng),那么這個(gè)打印的名稱(chēng)到底是什么呢?此時(shí)就需要用到另外一個(gè)方法 getJobName方法。如使用String printname=pjop.getJopName()語(yǔ)句,來(lái)獲得打印的名稱(chēng)。當(dāng)調(diào)用這個(gè)方法時(shí),會(huì)返回一個(gè)字符串類(lèi)型的值,它就是打印窗口中顯示的打印名稱(chēng)。利用這個(gè)方法獲得這個(gè)打印名稱(chēng)的值之后,再將其傳遞給setJobName方法,就可以讓打印窗口顯示打印的名稱(chēng)了。所以,這兩個(gè)方法,一是獲取打印的名子,二是將打印的方法顯示在打印窗口中,他們往往是同時(shí)出現(xiàn)的,相互配合實(shí)現(xiàn)這一組功能。這里需要注意的是,在使用getJopName()成員方法獲得打印任務(wù)的名稱(chēng)時(shí),一般情況下就顯示打印文檔的名子。但是如果用戶(hù)有特殊的要求,如在一些共享打印服務(wù)器或者網(wǎng)絡(luò)打印服務(wù)器中,除了要顯示打印文檔的名字,還需要現(xiàn)實(shí)打印著的電腦名字或者IP地址的話(huà),那么需要對(duì)這個(gè)方法進(jìn)行適當(dāng)?shù)恼{(diào)整。讓其不僅要取得打印文件的名字,同時(shí)要獲得打印者的主機(jī)名字或者IP地址。
在這個(gè)類(lèi)中,還有一個(gè)現(xiàn)成的控制打印狀態(tài)的方法。用戶(hù)在打印的過(guò)程中,如果發(fā)現(xiàn)某個(gè)需要打印的文件不是其要打印的?;蛘呔W(wǎng)絡(luò)管理員發(fā)現(xiàn)網(wǎng)絡(luò)打印機(jī)任務(wù)比較繁忙,要取消一些在隊(duì)列中等待的圖片文件的打印作業(yè)時(shí),就需要用到這個(gè)方法。打印控制器允許用戶(hù)如果打印作業(yè)正在進(jìn)行中或者出于隊(duì)列等待中,可以控制取消下一次打印作業(yè)。這主要是利用這個(gè)PrintJob類(lèi)的isCancelled方法來(lái)實(shí)現(xiàn)的。這個(gè)方法會(huì)返回布爾類(lèi)型的值,即true或者false。其中前者表示打印被取消了,后者表示打印沒(méi)有被取消。這個(gè)對(duì)應(yīng)關(guān)系不要搞錯(cuò),否則的話(huà),就可能會(huì)得到相反的結(jié)果。要取得打印狀態(tài),可以通過(guò)如下的語(yǔ)句來(lái)獲得:boolean pcancel=pjob.isCancelled()。從這個(gè)語(yǔ)法中可以看到這個(gè)方法返回的是一個(gè)boolean類(lèi)型的值。程序開(kāi)發(fā)人員就可以通過(guò)這個(gè)方法的返回值來(lái)判斷當(dāng)前打印程序的執(zhí)行狀態(tài)。有時(shí)候這個(gè)方法很重要。如為了縮短用戶(hù)打印的等待時(shí)間,會(huì)對(duì)某個(gè)網(wǎng)絡(luò)打印機(jī)的等待數(shù)量進(jìn)行限制。如只允許有50個(gè)文檔等待打印,那么就需要用到這個(gè)方法。先利用這個(gè)方法來(lái)判斷當(dāng)前隊(duì)列中有效的打印作業(yè),然后對(duì)其進(jìn)行統(tǒng)計(jì)。如果統(tǒng)計(jì)出來(lái)的結(jié)果已經(jīng)等于上限值的話(huà),就會(huì)禁止用戶(hù)添加新的打印作業(yè)。直到這個(gè)數(shù)量小于上限值才會(huì)恢復(fù)正常。#p#副標(biāo)題#e#
四、獲取打印用戶(hù)的信息。
某些網(wǎng)絡(luò)打印機(jī)還具有統(tǒng)計(jì)、權(quán)限控制等方面的功能。如可以統(tǒng)計(jì)各個(gè)用戶(hù)打印的文件數(shù)量,控制哪些用戶(hù)可以打印、哪些不可以打印等等,以提高企業(yè)網(wǎng)絡(luò)打印機(jī)的利用率。要實(shí)現(xiàn)這個(gè)功能,有一個(gè)前提就是要獲取打印用戶(hù)的信息。也就是說(shuō),網(wǎng)絡(luò)打印機(jī)必須要先了解當(dāng)前是哪個(gè)用戶(hù)提出了打印的請(qǐng)求,才能夠進(jìn)行用戶(hù)打印數(shù)量的統(tǒng)計(jì)或者打印權(quán)限的控制。在這個(gè)PrintJob類(lèi)中,有一個(gè)叫做getUserName的成員方法。通過(guò)引用這個(gè)成員方法可以獲取執(zhí)行打印任務(wù)的用戶(hù)名稱(chēng)。從而程序開(kāi)發(fā)人員可以利用這個(gè)用戶(hù)名稱(chēng)來(lái)實(shí)現(xiàn)如上的統(tǒng)計(jì)或者權(quán)限控制任務(wù)。
不過(guò)這里需要注意的是,要區(qū)分這個(gè)打印用戶(hù)的名稱(chēng)到底是哪個(gè)名稱(chēng)?這里有三個(gè)選項(xiàng),分別為用戶(hù)主機(jī)的名字、用戶(hù)當(dāng)前登錄操作系統(tǒng)的帳戶(hù)名字、用戶(hù)打印機(jī)系統(tǒng)中建立的帳戶(hù)等等。現(xiàn)在有些網(wǎng)絡(luò)打印機(jī)為了控制用戶(hù)的打印,已經(jīng)進(jìn)行了用戶(hù)訪問(wèn)的控制。也就是說(shuō),網(wǎng)絡(luò)打印機(jī)也向其他應(yīng)用軟件一樣,有了用戶(hù)登錄訪問(wèn)的控制。即企業(yè)員工需要憑借用戶(hù)名與密碼來(lái)進(jìn)行打印。所以程序開(kāi)發(fā)人員在開(kāi)發(fā)過(guò)程中,需要考慮讓這個(gè)成員方法獲得哪一個(gè)名字呢?一般情況下,如果網(wǎng)絡(luò)打印機(jī)沒(méi)有權(quán)限訪問(wèn)控制的話(huà),一般獲取用戶(hù)主機(jī)的名字或者IP地址即可。如果有用戶(hù)訪問(wèn)控制的話(huà),那么需要獲取的名字最好是用戶(hù)在網(wǎng)絡(luò)打印機(jī)系統(tǒng)中設(shè)置的用戶(hù)名。這可以方便統(tǒng)計(jì)以及用戶(hù)權(quán)限的控制。而且網(wǎng)絡(luò)打印機(jī)管理員也比較容易根據(jù)用戶(hù)的名稱(chēng)來(lái)控制打印隊(duì)列。如將提高某個(gè)用戶(hù)的打印優(yōu)先級(jí)(可以將經(jīng)理鄧用戶(hù)的優(yōu)先級(jí)提高)、取消某個(gè)用戶(hù)的打印等等。




滬公網(wǎng)安備 31011702001106號(hào)