swt打印专题 中国Eclipse社区 论坛 org.eclipse.swt 下载
先贴出陈刚编写的<eclipse 从入门到精通>中的一个打印的例子,然后对细节做讲解:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.printing.PrintDialog;
import org.eclipse.swt.printing.Printer;
import org.eclipse.swt.printing.PrinterData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class PrintTextExample {
public static void main(String[] args) {
try {
PrintTextExample window = new PrintTextExample();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}
public void open() {
final Display display = Display.getDefault();
final Shell shell = new Shell();
String fileName = "C:\Documents and Settings\Nie Hanzi\桌面\新建 文本文档.txt";
if (fileName != null) {
//用打印对话框取得一个打印对话printer
PrintDialog printDlg = new PrintDialog(shell);
PrinterData printerData = printDlg.open();
if (printerData != null) {
Printer printer = new Printer(printerData);
//打印文件
try {
String contents = getFileContents(fileName);//取出文件内容
MyPrinter p = new MyPrinter(printer, fileName, contents);
p.print();
} catch (java.lang.Exception e) {
e.printStackTrace();
}
printer.dispose();//printer对象没用后要手动dispose掉
}
}
display.dispose();
}
/**
* 取出文件内容的方法
*/
private String getFileContents(String fileName)
throws FileNotFoundException, IOException {
StringBuffer contents = new StringBuffer();
BufferedReader reader = null;
try {
reader = new BufferedReader(new FileReader(fileName));
while (reader.ready()) {
contents.append(reader.readLine());
contents.append("n"); //每读完一行,换行一次
}
} finally {
if (reader != null)
try {
reader.close();
} catch (IOException e) {
}
}
return contents.toString();
}
/**
* 自定义的打印实现类,将所需参数传入,调用print方法即可打印
*/
private class MyPrinter {
private Printer printer; // 打印对象
private String fileName; //文件名(带路径)
private String contents; //文件名对应的文件内容
private GC gc; //一个GC对象
private int xPos, yPos; //打印对象printer用的坐标
private Rectangle bounds; //打印空间
private StringBuffer buf; // Holds a word at a time
private int lineHeight; // The height of a line of text
/**
* 构造函数
*/
public MyPrinter(Printer printer, String fileName, String contents) {
this.printer = printer;
this.fileName = fileName;
this.contents = contents;
}
/**
* 打印文件的方法
*/
public void print() {
if (printer.startJob(fileName)) {//开始打印任务
//设定打印空间
bounds = computePrintArea(printer);
xPos = bounds.x;
yPos = bounds.y;
//创建GC对象
gc = new GC(printer);
//设定线的高度
lineHeight = gc.getFontMetrics().getHeight();
//设定tab键的空格数
int tabWidth = gc.stringExtent(" ").x;
//开始打印
printer.startPage();
buf = new StringBuffer();
char c;
for (int i = 0, n = contents.length(); i < n; i++) {
//得到文件内容的字符
c = contents.charAt(i);
//如果读到n,调用printBuffer方法将buf中的字符打印,并换行
if (c == ‘n‘) {
printBuffer();
printNewline();
}
//如果读到t,表示要跳过一定的空格
else if (c == ‘t‘) {
xPos += tabWidth;
} else {
buf.append(c);//将字符添加进buf变量
//检查是否有空间,如果则打印
if (Character.isWhitespace(c))
printBuffer();
}
}
printer.endPage();
printer.endJob();
gc.dispose();
}
}
/**
* 打印缓存buf变量中的字符
*/
private void printBuffer() {
//取得缓存中的字符宽度
int width = gc.stringExtent(buf.toString()).x;
//如果宽度不够,则换行
if (xPos + width > bounds.x + bounds.width)
printNewline();
//打印缓存buf变量中的字符
gc.drawString(buf.toString(), xPos, yPos, false);
xPos += width;
buf.setLength(0);
}
/**
* 打印换行的方法
*/
private void printNewline() {
//重设新行的坐标
xPos = bounds.x;
yPos += lineHeight;
//如果超过页长度,则换一页打印
if (yPos > bounds.y + bounds.height) {
yPos = bounds.y;
printer.endPage();
printer.startPage();
}
}
/**
* 计算打印空间的方法
*/
private Rectangle computePrintArea(Printer printer) {
//取得打印空间
Rectangle rect = printer.getClientArea();
Rectangle trim = printer.computeTrim(0, 0, 0, 0);
//取得打印机的DPI(DPI:表示每英寸的点数,即通常说的打印机的分辨率)
Point dpi = printer.getDPI();
// 计算可打印空间
int left = trim.x + dpi.x;
if (left < rect.x)
left = rect.x;
int right = (rect.width + trim.x + trim.width) - dpi.x;
if (right > rect.width)
right = rect.width;
int top = trim.y + dpi.y;
if (top < rect.y)
top = rect.y;
int bottom = (rect.height + trim.y + trim.height) - dpi.y;
if (bottom > rect.height)
bottom = rect.height;
return new Rectangle(left, top, right - left, bottom - top);
}
}
}
printer.computeTrim(0, 0, 0, 0)返回不可用的区域
DPI:表示每英寸的点数,即通常说的打印机的分辨率
例如A4值的高是297mm,宽是210mm,加入DPI是(300,300),每英寸为25.4mm,折算成象素就是(3508,2480)。
更多阅读
2014年中国国际铝业论坛安泰科年会 纪要转 安泰科年会
2014年11月25日,由中国有色金属工业协会主办、安泰科承办的中国国际铝业论坛在昆明举行,以下是本次会议的会议纪要:一、唐严——新形势下推动铝产业可持续发展的政策导向1、发改委将综合考虑成本、环境等因素对在建和已建的电解铝项
转载 中印瑜伽峰会-中国瑜伽论坛 昆明中印瑜伽大会
原文地址:中印瑜伽峰会-中国瑜伽论坛作者:太极瑜伽周媛主题一:中国瑜伽行业现状分析与未来发展方向主题二:瑜伽文化建设和品牌策略与推广因为参加论坛的大都是瑜伽会所的经营者和瑜伽老师,自己的角色又是从经营者回到传授者,对于瑜伽文
中国BBS社区100强候选名单 2015院士候选人名单
综合社区类 天涯社区(tianyaclub) Tom社区 腾讯讨论组 和讯博客西陆社区 e龙-西祠胡同 猫扑 百度贴吧搜狐社区 网易社区 新浪社区 中华网论坛千龙bbs 新华网发展论?/a> 21CN社区 大洋网论坛亿唐盛世 中国用户社区 CCTV-BBS 天极网论
中国网赚论坛大全(最新) 牛梦网赚论坛
中国网赚论坛大全(最新) 中国网赚论坛大全(最新)卓不凡网赚论坛 http://www.zhuobufan.com/中国网赚站 http://www.sohozhan.com (推荐)126网赚论坛 http://www.cash126.com (推荐)178网赚之家 http://www.soho178.com/bbs (推荐)平
中国雅虎论坛版主的心声 雅虎中国官网
哪些年,为了维护巧克力兔兔免被巧克力gg的欺负,我毅然学起了中文,和活跃于中国网络。这些年,意想不到的是,我竟然成了中国雅虎论坛的版主。然后陆续成为雅虎男人,原创天地,和女人爱晒,三大权威版的论坛版主。身为中国雅虎版主的其