java实现打印购物清单jframe_在java中打印2页的jframe
我想打印一个包含大量文本字段和包含数据的按钮的jframe.我想通过单击打印jbutton打印此jframe.我试过这段代码.
protected void print() {
PrinterJob job = PrinterJob.getPrinterJob();
if(job.printDialog()){
try {
job.setPrintable(new Printable() {
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if(pageIndex == 0){
Graphics2D g2d = (Graphics2D)graphics;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
Dimension dim = ODietListJFrame.this.getSize();
double cHeight = dim.getHeight();
double cWidth = dim.getWidth();
// get the bounds of the printable area
double pHeight = pageFormat.getImageableHeight();
double pWidth = pageFormat.getImageableWidth();
double xRatio = pWidth / cWidth;
double yRatio = pHeight / cHeight;
g2d.scale(xRatio, yRatio);
ODietListJFrame.this.printAll(g2d);
return PAGE_EXISTS;
}
return NO_SUCH_PAGE;
}
});
job.print();
} catch (PrinterException e) {
e.printStackTrace();
}
} else {
System.err.println("Error printing");
}
}
我的问题是我的jframe太大了,必须打印两页,这段代码打印第二页.我想从jframe打印第一部分.
感谢帮助.
解决方法:
因此,我们需要做的第一件事是确保打印的组件符合它的首选尺寸……
component.setSize(component.getPreferredSize());
这很重要,但请记住,这会影响屏幕上的组件……
接下来,我们需要确定是否要打印新页面或重新打印当前页面.发生这种情况是因为对于给定页面,可能会多次调用print …
if (lastPage != pageIndex) {
lastPage = pageIndex;
//...
}
然后我们需要计算适合当前页面的组件的y偏移量…
yOffset = height * pageIndex;
if (yOffset > component.getHeight()) {
yOffset = -1;
}
如果yOffset大于组件高度,那么我们不想再打印任何页面.
接下来,我们打印页面,为此,我们需要翻译Graphics上下文,以便yOffset成为新的0位置……
g2d.translate(0, -yOffset);
然后我们打印组件……
component.printAll(g2d);
例如…
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
import javax.print.attribute.standard.MediaSizeName;
import javax.print.attribute.standard.PrinterResolution;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.Scrollable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class PrintMe {
public static void main(String[] args) {
new PrintMe();
}
public PrintMe() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
TestPane testPane = new TestPane();
JButton btn = new JButton("Print");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
aset.add(MediaSizeName.ISO_A4);
aset.add(new PrinterResolution(300, 300, PrinterResolution.DPI));
PrinterJob pj = PrinterJob.getPrinterJob();
pj.setPrintable(new MultiPagePrintable(testPane));
if (pj.printDialog(aset)) {
try {
pj.print(aset);
testPane.getParent().invalidate();
testPane.getParent().validate();
} catch (PrinterException ex) {
ex.printStackTrace();
}
}
}
});
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(testPane));
frame.add(btn, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel implements Scrollable {
private BufferedImage img;
public TestPane() {
try {
img = ImageIO.read(new File("Get your own image"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
@Override
public Dimension getPreferredSize() {
return img == null ? new Dimension(200, 200) : new Dimension(img.getWidth(), img.getHeight());
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
Graphics2D g2d = (Graphics2D) g.create();
int x = (getWidth() - img.getWidth()) / 2;
int y = (getHeight() - img.getHeight()) / 2;
g2d.drawImage(img, x, y, this);
g2d.dispose();
}
}
@Override
public Dimension getPreferredScrollableViewportSize() {
return new Dimension(200, 200);
}
@Override
public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
return 128;
}
@Override
public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
return 128;
}
@Override
public boolean getScrollableTracksViewportWidth() {
return false;
}
@Override
public boolean getScrollableTracksViewportHeight() {
return false;
}
}
public class MultiPagePrintable implements Printable {
private JComponent component;
private int lastPage = 0;
private double yOffset;
public MultiPagePrintable(JComponent component) {
this.component = component;
}
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
int result = NO_SUCH_PAGE;
double height = pageFormat.getImageableHeight();
component.setSize(component.getPreferredSize());
if (lastPage != pageIndex) {
lastPage = pageIndex;
yOffset = height * pageIndex;
if (yOffset > component.getHeight()) {
yOffset = -1;
}
}
if (yOffset >= 0) {
Graphics2D g2d = (Graphics2D) graphics;
g2d.translate((int) pageFormat.getImageableX(),
(int) pageFormat.getImageableY());
g2d.translate(0, -yOffset);
component.printAll(g2d);
result = PAGE_EXISTS;
}
return result;
}
}
}
现在,这个例子只在垂直方向打印,如果你需要打印水平方向,它会变得更复杂,但基本概念保持不变
标签:java,printing,swing,jframe
来源: https://codeday.me/bug/20190929/1831762.html
java实现打印购物清单jframe_在java中打印2页的jframe相关推荐
- Java基础之购物清单
购物清单 题目一 实验内容 实验代码 实验结果 题目二 实验内容 实验代码 实验结果 题目一 实验内容 根据购物清单及会员级别完成以下操作及程序设计,计算消费金额以图1的形式输出结果(不要求表格) 表 ...
- c语言如何打印unicode字符,如何在C ++中打印Unicode字符?
杨魅力 要表示字符,您可以使用通用字符名称(UCN).字符'ф'的Unicode值为U + 0444,因此在C ++中您可以将其写为'\ u0444'或'\ U00000444'.此外,如果源代码编码 ...
- word怎么打印网格线_如何在Excel中打印网格线以及行标题和列标题
word怎么打印网格线 Gridlines and the row and column headings can be helpful when viewing data on worksheets ...
- oracle 打印值,oracle – 在SQL Developer中打印变量的值
我想打印一个特定变量的值在一个匿名块内.我使用Oracle SQL Developer.我尝试使用dbms_output.put_line.但它不工作.我使用的代码如下所示. SET SERVEROU ...
- python如何打印字符串_如何在Python中打印“漂亮”字符串输出
Standard Python string formatting就足够了. # assume that your data rows are tuples template = "{0:8 ...
- 使用CloudKit构建购物清单应用程序:简介
早在2012年,Apple随iOS 5一起推出了iCloud.与此同时,该公司宣布开发人员将可以通过许多API访问iCloud. 首先,开发人员有三种选择: 键值存储 文件储存 核心数据整合 这些AP ...
- python从零学习:商品列表及购物清单
噔噔噔呛! 时隔n久继续学习Python,现在跟着bilibili上的课程学到列表了,还学了元组和字典啥的,然后我就来写下小作业,请多赐教! 作业概述: 1.现有商品列表如下: products=[[ ...
- 在 Python 中打印换行符——打印一个新行
在编程中处理字符串或文本数据经常涉及打印换行符.一行的结尾由换行符表示,它还会将光标前进到下一行的开头.使用转义字符 " \n ",我们可以在 Python 中打印换行符. 其他编 ...
- java小票_Java编程打印购物小票实现代码
简单介绍运行环境: 语言:Java 工具:eclipse 系统:Windows7 (打印设备暂时没有,所以只能提供预览图) 最近,项目需要为商城做一个购物小票的打印功能,日常我们去超市买东西,结账的时 ...
最新文章
- cesium雷达图_20个简化开发任务的 JavaScript库
- SEP11备份与灾难恢复-官方文档
- java爬去淘宝数据链接重定向_scrapy爬取天猫被重定向302问题
- ppt中的流程图怎么整体移动_PPT中图片太丑了?该怎么办?
- Oracle Form Builder
- 腾讯荣升Linux基金会白金会员助力支持开源社区
- 来,创建一个高效的IMEI编码生成器
- 鹅厂假前端实习鹅的实习日志
- 计算机有哪些交叉专业研究生,与理工科交叉的计算机专业考研方向有哪些?
- JSP界面——背景图片
- 实现连续签到案例的可能(使用)
- app维持h5登录状态_维持团队设计质量的5种工具
- long(Long)与int(Integer)四种类型之间互相转换的方法分享
- 什么是前端模块化?为什么要进行模块化开发?前端技术文章分享
- 如何编辑二维码内容并批量生成
- css中文字体乱码解决方案:
- 亨利·明茨伯格(Henry Mintzberg)质量管理学大师
- 信息技术领域排名增速第一, 再登中国500强!陌陌做对了什么?
- 扬州大学c语言上级作业链表,一道关于结构体和单向链表的C语言编程题求助各位大佬!!!...
- 【按键精灵篇】如何做一个自动打开APP进入注册页面自动输入自己手机号
热门文章
- java 多行 n_Java实现向Word添加多行图片水印
- 事务里面捕获异常_三问Spring事务:解决什么问题?如何解决?存在什么问题?...
- Linux 之十二 Makefile 从入门到放弃全解
- 算法练习day10——190328(根据指定值划分单链表、复制含有rand指针节点的链表、两个单链表相交)
- linux / pkg-config 原理及用法
- 启明云端分享|在应用SSD201\SSD202D 核心板时,文件系统只读相关问题解决
- 启明云端分享| 图文+实操+视频,手把手教你Eclipse搭建esp-idf环境
- iap升级问题 stm32f103r8_STM32的基于串口的IAP固件升级与加密
- php中angular,Angular是什么
- 项目G2SVG.text转换