我想打印一个包含大量文本字段和包含数据的按钮的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相关推荐

  1. Java基础之购物清单

    购物清单 题目一 实验内容 实验代码 实验结果 题目二 实验内容 实验代码 实验结果 题目一 实验内容 根据购物清单及会员级别完成以下操作及程序设计,计算消费金额以图1的形式输出结果(不要求表格) 表 ...

  2. c语言如何打印unicode字符,如何在C ++中打印Unicode字符?

    杨魅力 要表示字符,您可以使用通用字符名称(UCN).字符'ф'的Unicode值为U + 0444,因此在C ++中您可以将其写为'\ u0444'或'\ U00000444'.此外,如果源代码编码 ...

  3. word怎么打印网格线_如何在Excel中打印网格线以及行标题和列标题

    word怎么打印网格线 Gridlines and the row and column headings can be helpful when viewing data on worksheets ...

  4. oracle 打印值,oracle – 在SQL Developer中打印变量的值

    我想打印一个特定变量的值在一个匿名块内.我使用Oracle SQL Developer.我尝试使用dbms_output.put_line.但它不工作.我使用的代码如下所示. SET SERVEROU ...

  5. python如何打印字符串_如何在Python中打印“漂亮”字符串输出

    Standard Python string formatting就足够了. # assume that your data rows are tuples template = "{0:8 ...

  6. 使用CloudKit构建购物清单应用程序:简介

    早在2012年,Apple随iOS 5一起推出了iCloud.与此同时,该公司宣布开发人员将可以通过许多API访问iCloud. 首先,开发人员有三种选择: 键值存储 文件储存 核心数据整合 这些AP ...

  7. python从零学习:商品列表及购物清单

    噔噔噔呛! 时隔n久继续学习Python,现在跟着bilibili上的课程学到列表了,还学了元组和字典啥的,然后我就来写下小作业,请多赐教! 作业概述: 1.现有商品列表如下: products=[[ ...

  8. 在 Python 中打印换行符——打印一个新行

    在编程中处理字符串或文本数据经常涉及打印换行符.一行的结尾由换行符表示,它还会将光标前进到下一行的开头.使用转义字符 " \n ",我们可以在 Python 中打印换行符. 其他编 ...

  9. java小票_Java编程打印购物小票实现代码

    简单介绍运行环境: 语言:Java 工具:eclipse 系统:Windows7 (打印设备暂时没有,所以只能提供预览图) 最近,项目需要为商城做一个购物小票的打印功能,日常我们去超市买东西,结账的时 ...

最新文章

  1. cesium雷达图_20个简化开发任务的 JavaScript库
  2. SEP11备份与灾难恢复-官方文档
  3. java爬去淘宝数据链接重定向_scrapy爬取天猫被重定向302问题
  4. ppt中的流程图怎么整体移动_PPT中图片太丑了?该怎么办?
  5. Oracle Form Builder
  6. 腾讯荣升Linux基金会白金会员助力支持开源社区
  7. 来,创建一个高效的IMEI编码生成器
  8. 鹅厂假前端实习鹅的实习日志
  9. 计算机有哪些交叉专业研究生,与理工科交叉的计算机专业考研方向有哪些?
  10. JSP界面——背景图片
  11. 实现连续签到案例的可能(使用)
  12. app维持h5登录状态_维持团队设计质量的5种工具
  13. long(Long)与int(Integer)四种类型之间互相转换的方法分享
  14. 什么是前端模块化?为什么要进行模块化开发?前端技术文章分享
  15. 如何编辑二维码内容并批量生成
  16. css中文字体乱码解决方案:
  17. 亨利·明茨伯格(Henry Mintzberg)质量管理学大师
  18. 信息技术领域排名增速第一, 再登中国500强!陌陌做对了什么?
  19. 扬州大学c语言上级作业链表,一道关于结构体和单向链表的C语言编程题求助各位大佬!!!...
  20. 【按键精灵篇】如何做一个自动打开APP进入注册页面自动输入自己手机号

热门文章

  1. java 多行 n_Java实现向Word添加多行图片水印
  2. 事务里面捕获异常_三问Spring事务:解决什么问题?如何解决?存在什么问题?...
  3. Linux 之十二 Makefile 从入门到放弃全解
  4. 算法练习day10——190328(根据指定值划分单链表、复制含有rand指针节点的链表、两个单链表相交)
  5. linux / pkg-config 原理及用法
  6. 启明云端分享|在应用SSD201\SSD202D 核心板时,文件系统只读相关问题解决
  7. 启明云端分享| 图文+实操+视频,手把手教你Eclipse搭建esp-idf环境
  8. iap升级问题 stm32f103r8_STM32的基于串口的IAP固件升级与加密
  9. php中angular,Angular是什么
  10. 项目G2SVG.text转换