PrintJob
Printable類
打印主要通過PrintJob類的print的回調函數來實現打印的全部工作
PrintJob類是抽象類
不能new一個實例
但通過它的一個靜態方法getPrintJob就可以得到一個PrintJob句柄
有了這樣一個操縱桿
我們可以隨時打開開關
叫它
快給我打印!
(print)
如果這樣
它會問你
叫我打印什麼呢?
即回調你的打印內容
如果你沒有打印的內容
它會拋出一句話
沒有東西嘛!
(PrintException)
否則它就會忠實的根據需求打印
所以你應該提供一個可打印的內容(Printable)
只有一個方法需要你實現
print(Graphics g
PageFormat pf
int pageIndex );
你所有的打印控制其實都是在該方法中實現
提供一個最簡單的例子
import java
awt
Graphics;
import java
awt
print
*;
public class TestPrint {
public static void main(String[] args) {
PrintJob job = PrintJob
getPrintJob();//獲得句柄
job
setPrintable(new Hello());//告訴job到哪裡找打印內容
try{
job
print();//快給我打印!
}catch(PrintException e) {
System
out
println(
沒有東西嘛!
);//或打印機硬件問題
}
}
class Hello implements Printable {//可打印的內容
public int print(Graphics g
//可以任意畫打印的內容的白紙
PageFormat pf
// 打印格式
缺省
int pageIndex ) {// 頁碼
從
開始
if(pageIndex !=
)return NO_SUCH_PAGE;//停止打印
g
drawString(
Hello World!
);//在紙上畫字符串
return PAGE_EXITS;//繼續打印
}
}
}
怎麼樣?夠方便吧
發揮你的想象
在Graphics上畫你喜歡的東西吧!
PageFormat
Paper類
在例子中的Printable的print()方法的參數列表中
PageFormat類有點陌生
顧名思義
它是打印的格式
我們在打印過程中選擇的橫打
縱打
頁邊距都是由PageFormat控制的
默認的格式是Letter紙
普通的頁邊距(通過PrintJob的defaultPage得到)
在你得到PageFormat實例後
你可以輕松設置打印的區域(不能直接設置紙張的大小)
打印方向
如何改變紙張的大小呢?java自帶的頁面設置有幾種典型的紙張類型(A
A
等)
如果要自定義紙張大小
從PageFormat實例中的getPaper()方法獲得名為Paper的實例
再通過Paper的setSize()改變紙張實際大小
講了這麼多
看一個例子
import java
awt
*;
import java
awt
print
*;
public class TestFormat {
public static void main(String[] args) {
PrinterJob job = PrintJob
getPrinterJob();
PageFormat pageFormat = job
defaultPage();//得到默認頁格式
double inch =
;//一英寸
Paper paper = pageFormat
getPaper();//得到頁面格式的紙張
paper
setSize(
* inch
* inch);//紙張大小為
英寸見方
pageFormat
setImageableArea(
inch
//坐標x
即左頁邊距
英寸
inch
//坐標y
即上頁邊距
英寸
paper
getWidth()
* inch
//寬度
英寸
英寸(左右各
英寸)
paper
getHeight()
* inch);//高度
英寸
英寸(上下各
英寸)
pageFormat
setPaper(paper);//將該紙張作為格式
job
setPrintable(new Rect()
pageFormat);//不止提供打印內容
還有格式
if(job
printDialog()) {//熟悉的打印設置對話框
OK返回true
Cancel返回false
try{
job
print();
}catch(PrinterException e){
System
out
println(e);
}
}
}
class Rect implements Printable {
public int print(Gaphics g
PageFormat pageFormat
int pageIndex) {
if(pageIndex !=
)return NO_SUCH_PAGE;
g
fillRect(
);//畫一個
的正方形
return PAGE_EXISTS;
}
}
}
相對於TestPrint
java
現在的例子復雜多了
所有新添加的內容都有注釋
本來想打印
的正方形
但當你興沖沖去取打印結果時
你只能得到一個小的多的正方形(實際上有
=
那麼大)
因為你是從紙的左上角開始畫
但有一英寸的頁邊距讓你的構想變小了
如果你打印的東西是統一格式的(大部分情況都是如此)
打印就變得如此簡單
關鍵是你在紙上畫的東西根據頁碼(pageIndex)的不同能打印不同的東西
血的教訓
千萬在實現的print()方法中加入控制打印結束的語句(NO_SUCH_PAGE)
否則打印機會孜孜不倦的打到它打不動位置
我的抽屜內還有十幾張打印機的傑作
如果不是我強行關閉電源
它的發揮遠不止這些
預覽類的構造函數是這樣的
public PrintPreviewer(Pageable p
int page){
pageable=p;
pageIndex=page;
printComponent=new PrintComponent(null
null);
printComponent
setBorder(BorderFactory
createBevelBorder(
BevelBorder
RAISED));
buildLayout();
displayPage(pageIndex);
}
protected void buildLayout(){
setLayout(new BorderLayout());
JPanel panel=new JPanel();
panel
setLayout(new FlowLayout(FlowLayout
CENTER
));
panel
add(printComponent);
scrollPane=new JScrollPane(panel);
add(scrollPane
BorderLayout
CENTER);
add(getBottomPanel()
BorderLayout
SOUTH);
addListeners();
}
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25548.html