package tools;

 import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob; import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea; import comm.SysProperties; public class PrintTxt extends JFrame implements Printable, ActionListener {
/**
* 实现功能:调打印机打印文本内容
*/
private static final long serialVersionUID = 1L;// 序列化
private JButton printTextButton = new JButton("print txt");// 实例化打印文本按钮
private JPanel buttonPanel = new JPanel();// 一般轻量级容器,存放页面按钮等组件
private JTextArea area = new JTextArea();// 显示纯文本的多行区域。它作为一个轻量级组件
private JScrollPane scroll = new JScrollPane(area);// 轻量级组件的 scrollable 视图 private int PAGES = 0;// 打印总页
private String printStr; public PrintTxt() {// 初始化显示窗口
JFrame.setDefaultLookAndFeelDecorated(true);// 新创建的窗体设置一个默认外观显示
this.setSize(SysProperties.SCREEN_WIDTH, SysProperties.SCREEN_HEIGHT);// 設置窗口大小
this.setDefaultCloseOperation(EXIT_ON_CLOSE);// 设置点击关闭时退出
initLayout();// 界面上添加需要的組件
this.setLocationRelativeTo(null);// 组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央
this.setVisible(true);
} private void initLayout() {// 初始化界面组件
printTextButton.addActionListener(this);
printTextButton.setMnemonic(KeyEvent.VK_P);// 设置键盘上p键跟按钮绑定,Alt+p进行触发
buttonPanel.add(printTextButton);// 将按钮添加到JPanel这个中间容器
this.getContentPane().setLayout(new BorderLayout());// 设置内容面板为边框布局
this.getContentPane().add(scroll, BorderLayout.CENTER);// 添加scroll组件到JFrame内容面板的中位置
this.getContentPane().add(buttonPanel, BorderLayout.SOUTH);// 添加buttonPanel按钮这个中间容器到JFrame内容面板的南位置
} /**
* 打印文本
*/
private void printTextAction() {
printStr = area.getText().trim();
if (printStr != null && printStr.length() > 0) {
PAGES = getPagesCount(printStr);
PrinterJob prtJob = PrinterJob.getPrinterJob();// 创建并返回初始化时与默认打印机关联的PrinterJob
PageFormat pageFormat = prtJob.defaultPage();// 创建新的 PageFormat实例,并将它设置为默认大小和方向
prtJob.setPrintable(this, pageFormat);// 调用 painter,用指定的 format呈现该页面
if (prtJob.printDialog()) {
try {
prtJob.print();
} catch (PrinterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
JOptionPane.showConfirmDialog(null,
"Sorry, Printer Job is Empty, Print Cancelled!",
"Empty", JOptionPane.DEFAULT_OPTION,
JOptionPane.WARNING_MESSAGE);
}
}
} /**
* 计算需要打印的页数
*
* @param printStr
* @return 打印页数
*/
private int getPagesCount(String curStr) {
int count = 0, page = 0, position = 0;
while (curStr.length() > 0) {
position = curStr.indexOf("\n");
count++;// 记录行数
if (position != -1) {
curStr = curStr.substring(position + 1);
} else {
curStr = "";// 结束循环
}
} if (count > 0 && count <= 10) {
page = 1;
} else {
page = count / 10 + 1;// 规定10行为一页,计算打印的页数
}
return page;
} public static void main(String[] args) {
new PrintTxt();
} /**
* 绘制字符串内容
*
* @param g2
* @param pf
* @param page
*/
private void drawCurrentPageText(Graphics2D g2, PageFormat pf, int page) {
// TODO Auto-generated method stub
Font f = area.getFont();// 从系统属性列表返回一个 Font 对象
String s = getDrawText(printStr)[page];// 获取打印值
String drawText;
float ascent = 16;
int k, i = f.getSize(), lines = 0;
while (s.length() > 0 && lines < 10) {
k = s.indexOf('\n');
if (k != -1) {
lines++;
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;
drawText = s;
g2.drawString(drawText, 0, ascent);
s = "";
}
} } /**
* 获取需要绘制的文本字符串数组
*
* @param s
* @return
*/
private String[] getDrawText(String s) {
String[] drawText = new String[PAGES];// 声明一个长度为总页数的的字符串数组
for (int i = 0; i < PAGES; i++)
drawText[i] = "";// 这段是拿来干嘛的??
int k, suffix = 0, lines = 0;
while (s.length() > 0) {
if (lines < 10) {
k = s.indexOf('\n');// 记录是否换行
if (k != -1) {
++lines;
drawText[suffix] = drawText[suffix] + s.substring(0, k + 1);// ??拼接字符串
if (s.substring(k + 1).length() > 0) {
s = s.substring(k + 1);
}
} else {
++lines;
drawText[suffix] = drawText[suffix] + s;
s = "";
}
} else {
lines = 0;
suffix++;
}
}
return drawText; } /**
* 用于接收操作事件的侦听器接口
*
* @param e
*/
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
Object src = e.getSource();
if (src == printTextButton)
printTextAction();
} /**
* 覆写实现Printable接口的print方法
*/
@Override
public int print(Graphics g, PageFormat pf, int page)
throws PrinterException {
// TODO Auto-generated method stub
Graphics2D g2 = (Graphics2D) g;// ?这两个类都是抽象类,声明的只是引用类型,为何可以调用方法
g2.setPaint(Color.black);// 设置颜色
if (page >= PAGES)
return Printable.NO_SUCH_PAGE;// 表示页面不存在,结束打印
g2.translate(pf.getImageableX(), pf.getImageableY());// 将 Graphics2D
// 上下文的原点平移到当前坐标系中的点
// (x, y)
drawCurrentPageText(g2, pf, page); return Printable.PAGE_EXISTS;
} }

JFrame 文本打印的更多相关文章

  1. Unity3D_07_日志、文本打印

    1.Debug.Log(“hello”); 2.打开控制台查看日志:ctrl+shift+c 3.输出一个位置的坐标(需要转换成字符串.ToString()) Vector3 worldPositio ...

  2. [Java第一个游戏]JFrame文本框下贪吃蛇

    刚刚接触java的文本框绘图的知识点,然后就可以按照老师的提醒做一些简单的游戏,对JFrame加深一下,下面就贪吃蛇给出一些源代码,其实正真的实现的代码并不多,只是稍微处理一下就可以明白,下面代码均有 ...

  3. 【Python】用文本打印树

    From:http://zhidao.baidu.com/link?url=O8U5TynGBMojDw2iFhlghPPf5_ZE1X8CAQMrK19pv-KxhvKCc6Z2yzsoQaukgN ...

  4. LODOP中的纯文本和超文本打印项

    LODOP中的的打印项,有超文本也有纯文本,超文本指的是用html语言,html里的标签为值的打印项,该种打印项会经过浏览器解析,LODOP本身不带解析超文本的引擎,调用的windows底层引擎,与i ...

  5. Lodop打印控件输出页码(超文本和纯文本页码)

    Lodop打印控件打印超文本既可以手动分页,也可以自动分页,自动分页可阅读本博客的另一篇博文:Lodop打印控件 超文本自动分页 自动分页的时候,往往是不知道需要打印的内容到底分了几页,也就不可能预先 ...

  6. jQuery:实现网页的打印功能

    实现的打印功能大致跟浏览器的 Ctrl+P 效果一样 一.直接上代码 <!DOCTYPE html> <head> <meta charset="utf-8&q ...

  7. Linux Shell 文本处理工具集锦 zz

    内容目录: find 文件查找 grep 文本搜索 xargs 命令行参数转换 sort 排序 uniq 消除重复行 用tr进行转换 cut 按列切分文本 paste 按列拼接文本 wc 统计行和字符 ...

  8. JS实现页面打印

    [原文链接] 1.js实现(可实现局部打印) <input id="btnPrint" type="button" value="打印" ...

  9. jquery打印特定div

    实现javascript打印功能,打印整个页面就很简单,但如果指定打印某一个区域就有点难点,这里有一个jQuery插件PrintArea可实现打印页面某区域功能. 使用说明需要使用jQuery库文件和 ...

随机推荐

  1. angularJS中自定义指令

    学习了angularJS一周,但是大部分时间被自定义指令占用了.博主表示自学互联网好心塞的,发现问题的视觉很狭窄,这比解决问题要更难.这篇文章首先介绍了自定义,然后介绍了在使用自定义指令遇到的问题. ...

  2. jquery.html5uploader.js 上传控件

    插件地址:http://blog.csdn.net/never_say_goodbye/article/details/8598521 先上个效果图: 相比来说,效果还是很不错的 使用MVC3做服务器 ...

  3. IPC编程之共享内存

    一,共享内存介绍 共享内存是三个IPC(Inter-Process Communication)机制中的一个,它允许两个不相关的进程访问同一个逻辑内存.   二.共享内存使用的函数 #include ...

  4. SpringMVC RESTful中文乱码

    开发中常遇到各种中文乱码很少心烦,这里总结了各种中文乱码https://www.cnblogs.com/lwx521/p/9856186.html 下面以SpringMVC遇到的中文乱码为例详解 首先 ...

  5. eclipse 远程操作HIVE

    首先启动HiveServer hive --service hiveserver 10000 & 创建工程 引入包: 代码(简单的查询): package com.hive.jdbc; imp ...

  6. GC偏好的校正与偏好程度的评估

    在二代测序仪上测出的数据,通常都会表现出测序深度与GC 含量的相关性,称为GC bias. GC bias校正 为了后续生物信息分析更加准确,通常需要做GC bias的校正. 2010 年 steve ...

  7. \阶段4-独挡一面\项目-基于视频压缩的实时监控系统\Sprint2-采集端图像采集子系统设计

    1.在编写程序前有一个流程,思维导图: 初始化:包括初始化摄像头:注册事件到epoll 然后是开始启动采集:一旦开始采集我们的摄像头就会有数据了,它会触发事件处理函数:我们在这里的处理是保存这个图像: ...

  8. AQS(AbstractQueuedSynchronizer)应用案例-02

    1.概述 通过对AQS源码的熟悉,我们可以通过实现AQS实现自定义的锁来加深认识. 2.实现 1.首先我们确定目标是实现一个独占模式的锁,当其中一个线程获得资源时,其他线程再来请求,让它进入队列进行公 ...

  9. 【C#】VS2017 winform 打包

    首先要在想要打包的项目下创建一个新的项目, 创建好setup项目,之后点击属性,去修改打包软件的名字,ProductName....可以选填 到此已经创建好了setup工程了,那么下面开始将要打包的d ...

  10. 虚拟创建失败之Dbus调试

    DBus调试命令 查询连接名 ### 查询所有连接名 # dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.free ...