代码如下:

import java.awt.basicstroke;

import java.awt.borderlayout;

import java.awt.color;

import java.awt.component;

import java.awt.dimension;

import java.awt.font;

import java.awt.fontmetrics;

import java.awt.graphics;

import java.awt.graphics2d;

import java.awt.gridlayout;

import java.awt.event.actionevent;

import java.awt.event.actionlistener;

import java.awt.event.mouseadapter;

import java.awt.event.mouseevent;

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.jdialog;

import javax.swing.jframe;

import javax.swing.jpanel;

import javax.swing.jscrollpane;

import javax.swing.jtextarea;

import javax.swing.swingutilities;

import javax.swing.windowconstants;

import javax.swing.text.badlocationexception;

import javax.swing.text.document;

/**

* 使用了原始的分页方式去渲染jtextarea,提供了打印预览机制。

*

* 事实上,我们还可以通过其他方式打印jtextarea:

*

*

{@code component.print(graphics g);} or

* {@code component.printall(graphics g);}

*

{@code component.paint(graphics g);} or

* {@code component.paintall(graphics g);} whose rending may be slightly

* different to the previous method (for example, jframe)

*

{@code jtable.print();} or {@code jtextcomponent.print();} provide

* especially powerful and convenient printing mechanism

*

*

* @author gaowen

*/

public class printuicomponent extends jpanel implements actionlistener,

printable {

private static final long serialversionuid = 4797002827940419724l;

private static jframe frame;

private jtextarea textareatoprint;

private printerjob job;

private int[] pagebreaks;// array of page break line positions

private string[] textlines;

private header header;

public printuicomponent() {

super(new borderlayout());

textareatoprint = new jtextarea(50, 20);

for (int i = 1; i <= 50; i++) {

textareatoprint.append(line + i + \n);

}

jscrollpane scrollpane = new jscrollpane(textareatoprint);

scrollpane.setpreferredsize(new dimension(250, 200));

add(scrollpane, borderlayout.center);

jbutton printbutton = new jbutton(print this textarea);

printbutton.setname(printbutton);

printbutton.addactionlistener(this);

jbutton printpreviewbutton = new jbutton(print preview);

printpreviewbutton.setname(printpreviewbutton);

printpreviewbutton.addactionlistener(this);

jpanel buttongroup = new jpanel(new gridlayout(2, 1));

buttongroup.add(printbutton);

buttongroup.add(printpreviewbutton);

add(buttongroup, borderlayout.south);

/* initialize printerjob */

initprinterjob();

}

public static void main(string[] args) {

swingutilities.invokelater(new runnable() {

@override

public void run() {

createandshowgui();

}

});

}

private static void createandshowgui() {

frame = new jframe(print ui example);

frame.setcontentpane(new printuicomponent());

frame.pack();

frame.setlocationrelativeto(null);

frame.setdefaultcloseoperation(windowconstants.exit_on_close);

frame.setvisible(true);

}

private void inittextlines() {

document doc = textareatoprint.getdocument();

try {

string text = doc.gettext(0, doc.getlength());

textlines = text.split(\n);

} catch (badlocationexception e) {

e.printstacktrace();

}

}

private void initprinterjob() {

job = printerjob.getprinterjob();

job.setjobname(print textarea);// 出现在系统打印任务列表

job.setprintable(this);

}

@override

public int print(graphics graphics, pageformat pageformat, int pageindex)

throws printerexception {

/*

* it is safe to use a copy of this graphics as this will not involve

* changes to it.

*/

graphics2d g2 = (graphics2d) graphics.create();

/* calculate pagebreaks */

font font = new font(serif, font.plain, 12);

fontmetrics metrics = g2.getfontmetrics(font);

int lineheight = metrics.getheight();

if (pagebreaks == null) {

inittextlines();

int linesperpage = (int) (pageformat.getimageableheight() / lineheight);

int numbreaks = (textlines.length - 1) / linesperpage;

pagebreaks = new int[numbreaks];

for (int b = 0; b < numbreaks; b++) {

pagebreaks[b] = (b + 1) * linesperpage;

}

}

/* condition to exit printing */

if (pageindex > pagebreaks.length) {

return no_such_page;

}

/* (0,0) is outside the imageable area, translate to avoid clipping */

g2.translate(pageformat.getimageablex(), pageformat.getimageabley());

/* draw each line that is on this page */

int y = 0;

int start = (pageindex == 0) ? 0 : pagebreaks[pageindex - 1];

int end = (pageindex == pagebreaks.length) ? textlines.length

: pagebreaks[pageindex];

for (int line = start; line < end; line++) {

y += lineheight;

g2.drawstring(textlines[line], 0, y);

}

/* dispose of the graphics copy */

g2.dispose();

/* tell the caller that this page is part of the printed document */

return page_exists;

}

@override

public void actionperformed(actionevent e) {

object actioneventsource = e.getsource();

if (actioneventsource instanceof jbutton) {

jbutton button = (jbutton) actioneventsource;

if (button.getname().equals(printbutton)) {

pagebreaks = null;// reset pagination

boolean ok = job.printdialog();

if (ok) {

try {

job.print();

} catch (printerexception ex) {

/* the job did not successfully complete */

ex.printstacktrace();

}

}

} else if (button.getname().equals(printpreviewbutton)) {

pagebreaks = null;// reset pagination

createandshowpreviewdialog();

}

}

}

private void createandshowpreviewdialog() {

jdialog previewdialog = new jdialog(frame, print preview dialog, true);

jpanel contentpane = new jpanel(new borderlayout());

previewarea previewarea = new previewarea();

previewarea.addmouselistener(new previewareamouseadapter(previewarea));

jscrollpane scrollpane = new jscrollpane(previewarea);

contentpane.add(scrollpane, borderlayout.center);

header = new header(previewarea);

contentpane.add(header, borderlayout.north);

previewdialog.setcontentpane(contentpane);

previewdialog.setsize(600, 600);

previewdialog

.setdefaultcloseoperation(windowconstants.dispose_on_close);

previewdialog.setvisible(true);

}

private class header extends component {

private static final long serialversionuid = -1741188309769027249l;

private previewarea previewarea;

private boolean paintable;

private header(previewarea previewarea) {

this.previewarea = previewarea;

}

private void setpaintable(boolean paintable) {

this.paintable = paintable;

}

@override

public void paint(graphics g) {

if (paintable) {

g.setcolor(color.gray);

g.drawstring(

string.valueof(previewarea.getpageindex() + 1)

+ /

+ string.valueof(pagebreaks.length + 1)

+ pages (click left mouse button to preview next page; right to previous),

10, 15);

}

}

@override

public dimension getpreferredsize() {

return new dimension(super.getpreferredsize().width, 20);

}

}

private class previewarea extends component {

private static final long serialversionuid = -6384174997251439843l;

private pageformat pageformat;

private int pageindex;

private int w;

private int h;

private final int marginx = 10;

private final int marginy = 20;

private previewarea() {

pageformat = job.pagedialog(job.defaultpage());

pageindex = 0;

w = (int) pageformat.getwidth();

h = (int) pageformat.getheight();

}

private int getpageindex() {

return pageindex;

}

private void setpageindex(int pageindex) {

this.pageindex = pageindex;

}

@override

public dimension getpreferredsize() {

return new dimension(w + 2 * marginx, h + 2 * marginy);

}

@override

public void paint(graphics g) {

graphics2d g2 = (graphics2d) g.create();

g2.translate(marginx, marginy);

g2.drawrect(0, 0, w, h);

int ix = (int) (pageformat.getimageablex() - 1);

int iy = (int) (pageformat.getimageabley() - 1);

int iw = (int) (pageformat.getimageablewidth() + 1);

int ih = (int) (pageformat.getimageableheight() + 1);

g2.setstroke(new basicstroke(1f, basicstroke.cap_round,

basicstroke.join_round, 10f, new float[] { 5, 5 }, 0f));

g2.drawrect(ix, iy, iw, ih);

try {

printuicomponent.this.print(g2, pageformat, pageindex);

} catch (printerexception e) {

e.printstacktrace();

}

g2.dispose();

header.setpaintable(true);

header.repaint();

}

}

private class previewareamouseadapter extends mouseadapter {

private previewarea previewarea;

private previewareamouseadapter(previewarea previewarea) {

this.previewarea = previewarea;

}

@override

public void mouseclicked(mouseevent e) {

int currentindex = previewarea.getpageindex();

if (e.getbutton() == mouseevent.button1) {

/* next page */

if (currentindex < pagebreaks.length) {

previewarea.setpageindex(currentindex + 1);

previewarea.repaint();

}

} else if (e.getbutton() == mouseevent.button3) {

/* previous page */

if (currentindex > 0) {

previewarea.setpageindex(currentindex - 1);

previewarea.repaint();

}

}

}

}

}

更多信息请查看IT技术专栏

java 打印预览_java打印和打印预览机制实例代码相关推荐

  1. java同步方法的特点_java多线程有哪些优点?同步实例代码展示

    在我们的日常学习当中会发现java的知识点是总是息息相关的,可以串联起来.java中多线程的有关内容可以衍生出更多知识,它的优缺点也是非常明显的.你都了解吗?一起来看看吧. 首先为大家介绍一下,多线程 ...

  2. java 匿名接口实现_Java通过接口实现匿名类的实例代码

    package com.chase.test; /** * 通过接口实现匿名类的实例 * * @author chase * * @date 2013-10-18 下午04:28:17 * * @ve ...

  3. java正向最大匹配算法_java中文分词之正向最大匹配法实例代码

    前言 基于词典的正向最大匹配算法(最长词优先匹配),算法会根据词典文件自动调整最大长度,分词的好坏完全取决于词典. 所谓词典正向最大匹配就是将一段字符串进行分隔,其中分隔 的长度有限制,然后将分隔的子 ...

  4. java数字格式化为货币字符串_Java把数字格式化为货币字符串实例代码

    数字可以标志货币.百分比.积分和电话号码等,就货币而言,在不同的国家会以不同的格式来定义,本实例将接收用户输入的数字,然后在控制台中输出其货币格式,其中使用了不同国家的货币格式. 思路如下:使用Num ...

  5. java代码实现文件扫描_JAVA文件扫描(递归)的实例代码

    具体代码如下所示: import java.io.File; public class Scan { public static void main(String[] args) { String f ...

  6. java四子棋实验报告_Python 实现劳拉游戏的实例代码(四连环、重力四子棋)

    游戏规则:双方轮流选择棋盘的列号放进自己的棋子, 若棋盘上有四颗相同型号的棋子在一行.一列或一条斜线上连接起来, 则使用该型号棋子的玩家就赢了! 程序实现游戏,并将每局的数据保存到本地的文件中 首先我 ...

  7. java 读取raw文件_Android 读取assets和raw文件内容实例代码

    这篇文章主要介绍了Android 读取assets和raw文件内容的相关资料,并附简单实例代码,需要的朋友可以参考下 android之文件操作--读取assets和raw文件下的内容 1.分别创建as ...

  8. java list 元素排序_对arraylist中元素进行排序实例代码

    rrayList中的元素进行排序,主要考查的是对util包中的Comparator接口和Collections类的使用. 实现Comparator接口必须实现compare方法,自己可以去看API帮助 ...

  9. java 表头固定_BootStrap的table表头固定tbody滚动的实例代码

    关于bootstrap table其他知识不多说,直接给大家贴代码了. 关键代码如下所示: 栏目一栏目二栏目三栏目一栏目二栏目三 星期一星期二星期三星期一星期二星期三星期一星期二 星期二 星期三星期一 ...

最新文章

  1. 大连海事大学计算机系王兴元,王兴元,
  2. Repository 设计模式介绍
  3. 时间序列 线性回归 区别_时间序列分析的完整介绍(带R)::线性过程I
  4. EasyUI 表格点击右键添加或刷新 绑定右键菜单
  5. Python:cv2.imwrite无法存储带有中文路径图片
  6. 常用的delphi 第三方控件
  7. 如何制造万能版的Ghost版Windows?[转]
  8. 面向对象三大特征之多态——Java笔记(七)
  9. 几款脑力训练软件分析与推荐
  10. python中根据视频帧生成视频,保存为mp4格式
  11. java私聊_java Socket实现多人群聊与私聊功能
  12. 【滤镜算法】低多边形风格介绍及Matlab实现
  13. JAVA Oracle插入大量数据优化
  14. 欢迎大家加入Xcode公社
  15. samba 本地设备名已在使用中 此连接尚未恢复
  16. python教程111-Python多条件计数与求和
  17. Java中Properties类的使用
  18. word批注怎么删除计算机名字,Word在添加批注时姓名会出现匿名注释如何删除
  19. 有哪些地图编辑平台?制作地图软件哪个最好?
  20. 不管你学的是什么专业,你都应该多少懂些管理学的东西之【鳄鱼法则】【鲇鱼效应】...

热门文章

  1. exists查询慢_我大意了!这些问题让我的MySQL慢了十倍。
  2. android linux 优化,【「Android」UE手游研发中,如何做好Android内存优化?】|Linux|DEX|腾讯游戏|_傻大方...
  3. 将图片储存在dataset_最新15-16方联体垃圾箱价格图片
  4. python连接数据库设置编码_python操作mysql中文显示乱码的解决方法
  5. Java和线性代数的关系_高等数学,线性代数与计算机的关系?
  6. wetool个人版_个人版wetool -公众号
  7. matlab ofdmmodulator,那位高手指点一下OFDM的基本仿真,用MATLAB,谢谢了
  8. 中文论文万能句型_干货|SCI论文写作的万能句型~
  9. abp 上如何使用getstoredproccommand_多效唑,如何在柑橘上安全使用
  10. SpringBoot 工程目录 整合mybatis-neo4j(注解类型)-增删改查