java 打印预览_java打印和打印预览机制实例代码
代码如下:
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打印和打印预览机制实例代码相关推荐
- java同步方法的特点_java多线程有哪些优点?同步实例代码展示
在我们的日常学习当中会发现java的知识点是总是息息相关的,可以串联起来.java中多线程的有关内容可以衍生出更多知识,它的优缺点也是非常明显的.你都了解吗?一起来看看吧. 首先为大家介绍一下,多线程 ...
- java 匿名接口实现_Java通过接口实现匿名类的实例代码
package com.chase.test; /** * 通过接口实现匿名类的实例 * * @author chase * * @date 2013-10-18 下午04:28:17 * * @ve ...
- java正向最大匹配算法_java中文分词之正向最大匹配法实例代码
前言 基于词典的正向最大匹配算法(最长词优先匹配),算法会根据词典文件自动调整最大长度,分词的好坏完全取决于词典. 所谓词典正向最大匹配就是将一段字符串进行分隔,其中分隔 的长度有限制,然后将分隔的子 ...
- java数字格式化为货币字符串_Java把数字格式化为货币字符串实例代码
数字可以标志货币.百分比.积分和电话号码等,就货币而言,在不同的国家会以不同的格式来定义,本实例将接收用户输入的数字,然后在控制台中输出其货币格式,其中使用了不同国家的货币格式. 思路如下:使用Num ...
- java代码实现文件扫描_JAVA文件扫描(递归)的实例代码
具体代码如下所示: import java.io.File; public class Scan { public static void main(String[] args) { String f ...
- java四子棋实验报告_Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
游戏规则:双方轮流选择棋盘的列号放进自己的棋子, 若棋盘上有四颗相同型号的棋子在一行.一列或一条斜线上连接起来, 则使用该型号棋子的玩家就赢了! 程序实现游戏,并将每局的数据保存到本地的文件中 首先我 ...
- java 读取raw文件_Android 读取assets和raw文件内容实例代码
这篇文章主要介绍了Android 读取assets和raw文件内容的相关资料,并附简单实例代码,需要的朋友可以参考下 android之文件操作--读取assets和raw文件下的内容 1.分别创建as ...
- java list 元素排序_对arraylist中元素进行排序实例代码
rrayList中的元素进行排序,主要考查的是对util包中的Comparator接口和Collections类的使用. 实现Comparator接口必须实现compare方法,自己可以去看API帮助 ...
- java 表头固定_BootStrap的table表头固定tbody滚动的实例代码
关于bootstrap table其他知识不多说,直接给大家贴代码了. 关键代码如下所示: 栏目一栏目二栏目三栏目一栏目二栏目三 星期一星期二星期三星期一星期二星期三星期一星期二 星期二 星期三星期一 ...
最新文章
- 大连海事大学计算机系王兴元,王兴元,
- Repository 设计模式介绍
- 时间序列 线性回归 区别_时间序列分析的完整介绍(带R)::线性过程I
- EasyUI 表格点击右键添加或刷新 绑定右键菜单
- Python:cv2.imwrite无法存储带有中文路径图片
- 常用的delphi 第三方控件
- 如何制造万能版的Ghost版Windows?[转]
- 面向对象三大特征之多态——Java笔记(七)
- 几款脑力训练软件分析与推荐
- python中根据视频帧生成视频,保存为mp4格式
- java私聊_java Socket实现多人群聊与私聊功能
- 【滤镜算法】低多边形风格介绍及Matlab实现
- JAVA Oracle插入大量数据优化
- 欢迎大家加入Xcode公社
- samba 本地设备名已在使用中 此连接尚未恢复
- python教程111-Python多条件计数与求和
- Java中Properties类的使用
- word批注怎么删除计算机名字,Word在添加批注时姓名会出现匿名注释如何删除
- 有哪些地图编辑平台?制作地图软件哪个最好?
- 不管你学的是什么专业,你都应该多少懂些管理学的东西之【鳄鱼法则】【鲇鱼效应】...
热门文章
- exists查询慢_我大意了!这些问题让我的MySQL慢了十倍。
- android linux 优化,【「Android」UE手游研发中,如何做好Android内存优化?】|Linux|DEX|腾讯游戏|_傻大方...
- 将图片储存在dataset_最新15-16方联体垃圾箱价格图片
- python连接数据库设置编码_python操作mysql中文显示乱码的解决方法
- Java和线性代数的关系_高等数学,线性代数与计算机的关系?
- wetool个人版_个人版wetool -公众号
- matlab ofdmmodulator,那位高手指点一下OFDM的基本仿真,用MATLAB,谢谢了
- 中文论文万能句型_干货|SCI论文写作的万能句型~
- abp 上如何使用getstoredproccommand_多效唑,如何在柑橘上安全使用
- SpringBoot 工程目录 整合mybatis-neo4j(注解类型)-增删改查