1. package tools;
  2.  
  3. import java.awt.BorderLayout;
  4. import java.awt.Color;
  5. import java.awt.Font;
  6. import java.awt.Graphics;
  7. import java.awt.Graphics2D;
  8. import java.awt.event.ActionEvent;
  9. import java.awt.event.ActionListener;
  10. import java.awt.event.KeyEvent;
  11. import java.awt.print.PageFormat;
  12. import java.awt.print.Printable;
  13. import java.awt.print.PrinterException;
  14. import java.awt.print.PrinterJob;
  15.  
  16. import javax.swing.JButton;
  17. import javax.swing.JFrame;
  18. import javax.swing.JOptionPane;
  19. import javax.swing.JPanel;
  20. import javax.swing.JScrollPane;
  21. import javax.swing.JTextArea;
  22.  
  23. import comm.SysProperties;
  24.  
  25. public class PrintTxt extends JFrame implements Printable, ActionListener {
  26. /**
  27. * 实现功能:调打印机打印文本内容
  28. */
  29. private static final long serialVersionUID = 1L;// 序列化
  30. private JButton printTextButton = new JButton("print txt");// 实例化打印文本按钮
  31. private JPanel buttonPanel = new JPanel();// 一般轻量级容器,存放页面按钮等组件
  32. private JTextArea area = new JTextArea();// 显示纯文本的多行区域。它作为一个轻量级组件
  33. private JScrollPane scroll = new JScrollPane(area);// 轻量级组件的 scrollable 视图
  34.  
  35. private int PAGES = 0;// 打印总页
  36. private String printStr;
  37.  
  38. public PrintTxt() {// 初始化显示窗口
  39. JFrame.setDefaultLookAndFeelDecorated(true);// 新创建的窗体设置一个默认外观显示
  40. this.setSize(SysProperties.SCREEN_WIDTH, SysProperties.SCREEN_HEIGHT);// 設置窗口大小
  41. this.setDefaultCloseOperation(EXIT_ON_CLOSE);// 设置点击关闭时退出
  42. initLayout();// 界面上添加需要的組件
  43. this.setLocationRelativeTo(null);// 组件当前未显示,或者 c 为 null,则此窗口将置于屏幕的中央
  44. this.setVisible(true);
  45. }
  46.  
  47. private void initLayout() {// 初始化界面组件
  48. printTextButton.addActionListener(this);
  49. printTextButton.setMnemonic(KeyEvent.VK_P);// 设置键盘上p键跟按钮绑定,Alt+p进行触发
  50. buttonPanel.add(printTextButton);// 将按钮添加到JPanel这个中间容器
  51. this.getContentPane().setLayout(new BorderLayout());// 设置内容面板为边框布局
  52. this.getContentPane().add(scroll, BorderLayout.CENTER);// 添加scroll组件到JFrame内容面板的中位置
  53. this.getContentPane().add(buttonPanel, BorderLayout.SOUTH);// 添加buttonPanel按钮这个中间容器到JFrame内容面板的南位置
  54. }
  55.  
  56. /**
  57. * 打印文本
  58. */
  59. private void printTextAction() {
  60. printStr = area.getText().trim();
  61. if (printStr != null && printStr.length() > 0) {
  62. PAGES = getPagesCount(printStr);
  63. PrinterJob prtJob = PrinterJob.getPrinterJob();// 创建并返回初始化时与默认打印机关联的PrinterJob
  64. PageFormat pageFormat = prtJob.defaultPage();// 创建新的 PageFormat实例,并将它设置为默认大小和方向
  65. prtJob.setPrintable(this, pageFormat);// 调用 painter,用指定的 format呈现该页面
  66. if (prtJob.printDialog()) {
  67. try {
  68. prtJob.print();
  69. } catch (PrinterException e) {
  70. // TODO Auto-generated catch block
  71. e.printStackTrace();
  72. }
  73. } else {
  74. JOptionPane.showConfirmDialog(null,
  75. "Sorry, Printer Job is Empty, Print Cancelled!",
  76. "Empty", JOptionPane.DEFAULT_OPTION,
  77. JOptionPane.WARNING_MESSAGE);
  78. }
  79. }
  80. }
  81.  
  82. /**
  83. * 计算需要打印的页数
  84. *
  85. * @param printStr
  86. * @return 打印页数
  87. */
  88. private int getPagesCount(String curStr) {
  89. int count = 0, page = 0, position = 0;
  90. while (curStr.length() > 0) {
  91. position = curStr.indexOf("\n");
  92. count++;// 记录行数
  93. if (position != -1) {
  94. curStr = curStr.substring(position + 1);
  95. } else {
  96. curStr = "";// 结束循环
  97. }
  98. }
  99.  
  100. if (count > 0 && count <= 10) {
  101. page = 1;
  102. } else {
  103. page = count / 10 + 1;// 规定10行为一页,计算打印的页数
  104. }
  105. return page;
  106. }
  107.  
  108. public static void main(String[] args) {
  109. new PrintTxt();
  110. }
  111.  
  112. /**
  113. * 绘制字符串内容
  114. *
  115. * @param g2
  116. * @param pf
  117. * @param page
  118. */
  119. private void drawCurrentPageText(Graphics2D g2, PageFormat pf, int page) {
  120. // TODO Auto-generated method stub
  121. Font f = area.getFont();// 从系统属性列表返回一个 Font 对象
  122. String s = getDrawText(printStr)[page];// 获取打印值
  123. String drawText;
  124. float ascent = 16;
  125. int k, i = f.getSize(), lines = 0;
  126. while (s.length() > 0 && lines < 10) {
  127. k = s.indexOf('\n');
  128. if (k != -1) {
  129. lines++;
  130. drawText = s.substring(0, k);
  131. g2.drawString(drawText, 0, ascent);
  132. if (s.substring(k + 1).length() > 0) {
  133. s = s.substring(k + 1);
  134. ascent += i;
  135. }
  136. } else {
  137. lines += 1;
  138. drawText = s;
  139. g2.drawString(drawText, 0, ascent);
  140. s = "";
  141. }
  142. }
  143.  
  144. }
  145.  
  146. /**
  147. * 获取需要绘制的文本字符串数组
  148. *
  149. * @param s
  150. * @return
  151. */
  152. private String[] getDrawText(String s) {
  153. String[] drawText = new String[PAGES];// 声明一个长度为总页数的的字符串数组
  154. for (int i = 0; i < PAGES; i++)
  155. drawText[i] = "";// 这段是拿来干嘛的??
  156. int k, suffix = 0, lines = 0;
  157. while (s.length() > 0) {
  158. if (lines < 10) {
  159. k = s.indexOf('\n');// 记录是否换行
  160. if (k != -1) {
  161. ++lines;
  162. drawText[suffix] = drawText[suffix] + s.substring(0, k + 1);// ??拼接字符串
  163. if (s.substring(k + 1).length() > 0) {
  164. s = s.substring(k + 1);
  165. }
  166. } else {
  167. ++lines;
  168. drawText[suffix] = drawText[suffix] + s;
  169. s = "";
  170. }
  171. } else {
  172. lines = 0;
  173. suffix++;
  174. }
  175. }
  176. return drawText;
  177.  
  178. }
  179.  
  180. /**
  181. * 用于接收操作事件的侦听器接口
  182. *
  183. * @param e
  184. */
  185. @Override
  186. public void actionPerformed(ActionEvent e) {
  187. // TODO Auto-generated method stub
  188. Object src = e.getSource();
  189. if (src == printTextButton)
  190. printTextAction();
  191. }
  192.  
  193. /**
  194. * 覆写实现Printable接口的print方法
  195. */
  196. @Override
  197. public int print(Graphics g, PageFormat pf, int page)
  198. throws PrinterException {
  199. // TODO Auto-generated method stub
  200. Graphics2D g2 = (Graphics2D) g;// ?这两个类都是抽象类,声明的只是引用类型,为何可以调用方法
  201. g2.setPaint(Color.black);// 设置颜色
  202. if (page >= PAGES)
  203. return Printable.NO_SUCH_PAGE;// 表示页面不存在,结束打印
  204. g2.translate(pf.getImageableX(), pf.getImageableY());// 将 Graphics2D
  205. // 上下文的原点平移到当前坐标系中的点
  206. // (x, y)
  207. drawCurrentPageText(g2, pf, page); return Printable.PAGE_EXISTS;
  208. }
  209.  
  210. }

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. python tarfile模块基本使用

    1.压缩一个文件夹下的所有文件 #coding=utf8 import os import tarfile __author__ = 'Administrator' def main(): cwd = ...

  2. USACO-Greedy Gift Givers(贪婪的送礼者)-Section1.2<2>

    [英文原题] Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange ...

  3. 相关符号标点的英文(IOS学习)

    尖括号: angle bracket 方括号: square bracket 花括号: curly brace 圆括号: parentheses 逗号: comma 冒号: colon 逗号: sem ...

  4. 进击的菜鸟问题1(设置checkbox全选)

    问题:设置页面标签属性时,常常使用jquery.attr("","");在设置checkbox属性时,会出现操作设置checkbox属性后,无法清除,导致第二次 ...

  5. CentOS 7 配置 mariadb

    一.安装mariadb :  yum groupinstall  mariadb  mariadb-client -y 二.启动(设置开机启动)服务 : systemctl  start (enabl ...

  6. shell分库备份

    分库备份企业实战题7:如何实现对MySQL数据库进行分库备份,请用脚本实现 #!/bin/bash MysqlUser=root PassWord=root Port= Socket="/u ...

  7. day18-事务与连接池 6.事务隔离级别与解决问题

    开两个cmd窗口,相当于两个事务. read-uncommitted这种级别是解决不了任何问题的,它什么情况都能出现.刚才演示了脏读,再演示就出现了不可重复读. read-committed隔离级别能 ...

  8. [dp]LCS最长公共子序列

    https://www.51nod.com/tutorial/course.html#!courseId=4 复杂度:${\rm O}(nm)$ 转移方程: #include<bits/stdc ...

  9. Java之网络编程UDP和TCP

    注*部分转来的 第1章 网络通信协议 通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样.在计算机网 ...

  10. Centos 查看机器型号

    测试机器的硬件信息: 查看CPU信息(型号) # cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 8 Intel(R) Xeon(R) CP ...