java怎么控制页面打印次数_java – 控制打印页面上面板的大小
我想用两张桌子打印jpanel.我遇到的两个问题,第一个是打印图像的准确性不是很好.第二个我怎样才能控制打印页面上jpanel的大小?
这是使用xps查看器打印页面的图像(准确性不好)
有没有像这样以这种精度制作打印图像
这是代码:
PrinterJob printjob = PrinterJob.getPrinterJob();
printjob.setJobName(" TESSCO CUSTOMER CARD ");
Printable printable = new Printable() {
public int print(Graphics pg, PageFormat pf, int pageNum) {
if (pageNum > 0) {
return Printable.NO_SUCH_PAGE;
}
Dimension size = jPanel1.getSize();
BufferedImage bufferedImage = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_RGB);
jPanel1.print(bufferedImage.getGraphics());
Graphics2D g2 = (Graphics2D) pg;
g2.translate(pf.getImageableX(), pf.getImageableY());
g2.drawImage(bufferedImage, 0, 0, (int) pf.getWidth(), (int) pf.getHeight(), null);
return Printable.PAGE_EXISTS;
}
};
Paper paper = new Paper();
paper.setImageableArea(0, 0,700,890);
paper.setSize(700,890);
PageFormat format = new PageFormat();
format.setPaper(paper);
format.setOrientation(PageFormat.LANDSCAPE);
printjob.setPrintable(printable, format);
if (printjob.printDialog() == false)
return;
try {
printjob.print();
} catch (PrinterException ex) {
System.out.println("NO PAGE FOUND." + ex);
}
解决方法:
首先,不要使用窗格大小,您需要充当布局管理器并调整面板大小以适合页面.
其次,不要使用缓冲图像.这将不会与打印引擎过去的图形上下文共享相同的属性.另外,另一种打印方法是可重入的,这意味着它可能会为每个页面调用多次,以这种方式创建缓冲图像会浪费资源
UPDATE
你可以做点什么……
public int print(Graphics pg, PageFormat pf, int pageNum) {
if (page > 0) {
return NO_SUCH_PAGE;
}
Graphics2D g2d = (Graphics2D)pg;
double pageWidth = pf.getImageableWidth();
double pageHeight = pf.getImageableHeight();
double pageX = pf.getImageableX();
double pageY = pf.getImageableY();
g2d.translate(pageX, pageY);
double tableHeight = pageHeight / 2d;
jPanel1.setBounds(0, 0, (int)Math.floor(pageWidth), (int)Math.floor(pageHeight));
jPanel1.printAll(g2d);
return Printable.PAGE_EXISTS;
}
请注意,这可能会截断您的表格.此外,您不应该使用屏幕上已有的组件执行此操作.您应该创建一个新的“打印”组件.
用工作示例更新
好吧,所以概念是合理的,只需要一些调整就可以使它工作;)
public class PrintTableTest {
public static void main(String[] args) {
final JTable table1 = new JTable(new AbstractTableModel() {
@Override
public int getRowCount() {
return 3;
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public String getColumnName(int column) {
String name = null;
switch (column) {
case 0:
name = "Day";
break;
case 1:
name = "FirstName";
break;
case 2:
name = "LastName";
break;
}
return name;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
Object value = null;
switch (columnIndex) {
case 0:
switch (rowIndex) {
case 0:
value = "First";
break;
case 1:
value = "Second";
break;
case 2:
value = "Final";
break;
}
break;
}
return value;
}
});
int rowHeight = (int) Math.floor(((700f / 2f) - table1.getTableHeader().getPreferredSize().height) / 3f);
table1.setRowHeight(rowHeight);
PrinterJob printjob = PrinterJob.getPrinterJob();
printjob.setJobName(" TESSCO CUSTOMER CARD ");
Printable printable;
printable = new Printable() {
public int print(Graphics pg, PageFormat pf, int pageNum) {
if (pageNum > 0) {
return NO_SUCH_PAGE;
}
Graphics2D g2d = (Graphics2D) pg;
double pageWidth = pf.getImageableWidth();
double pageHeight = pf.getImageableHeight();
double pageX = pf.getImageableX();
double pageY = pf.getImageableY();
g2d.translate(pageX, pageY);
// Each table will take half the page...
double tableHeight = pageHeight / 2d;
// We need to print the header as well...
JTableHeader header = table1.getTableHeader();
int headerHeight = header.getPreferredSize().height;
int yOffset = 0;
for (int index = 0; index < 2; index++) {
// Set the bounds of the components
// The yOffset is actuall irrelevent to us, but for consitency sake
// we'll keep it.
header.setBounds(0, yOffset, (int) Math.floor(pageWidth), headerHeight);
table1.setBounds(0, yOffset + headerHeight, (int) Math.floor(pageWidth), (int) Math.floor(tableHeight));
// Force the components to update there internal layouts to match
// the new size. We need to do this because, technically, we're not
// attached to any peer, nor do we want them to be taking into account
// the dimensions of any parent any way :P
table1.doLayout();
header.doLayout();
// Translate the graphics. Components asume a position of 0x0 when
// painting. This is a side effect of the AWT/Swing painting engine
// (for which we are greatful), but we need to simulate the change
g2d.translate(0, yOffset);
header.printAll(g2d);
// Translations are relative to the last translation...
g2d.translate(0, headerHeight);
table1.printAll(g2d);
// Reset the last translation
g2d.translate(0, -(headerHeight + yOffset));
// Next table...
yOffset += table1.getHeight();
}
return Printable.PAGE_EXISTS;
}
};
Paper paper = new Paper();
paper.setImageableArea(0, 0, 700, 890);
paper.setSize(700, 890);
PageFormat format = new PageFormat();
format.setPaper(paper);
format.setOrientation(PageFormat.LANDSCAPE);
// printjob.setPrintable(printable, format);
BufferedImage img = new BufferedImage(890, 700, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = img.createGraphics();
g2d.setColor(Color.WHITE);
g2d.fill(new Rectangle(0, 0, 890, 700));
try {
printable.print(g2d, format, 0);
} catch (Exception exp) {
exp.printStackTrace();
}
g2d.dispose();
try {
ImageIO.write(img, "png", new File("Print.png"));
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
标签:java,printing,swing
来源: https://codeday.me/bug/20191003/1849858.html
java怎么控制页面打印次数_java – 控制打印页面上面板的大小相关推荐
- java web 打印图片_java web打印总结
the contents you don't want to print 如果需要设置不打印区域,加入如下样式: 其实就是引用了noprint样式的控件不打印: 下面是media的相关 media类型 ...
- java 打印图片_java 实现打印(图片和文本)
// 打印内容到指定位置 public void printContent(Map mymap ) { printStr = "打印测试内容";// 获取需要打印的目标文本 if ...
- java控制float的位数_java控制float类型的小数位数
三个方法都可以 如下: (一):这种方法方便,我就使用这种方法 float a = 123.2334f; float b = (float)(Math.round(a*100))/ ...
- java打印正三角形_java实现打印正三角的方法
本文实例为大家分享了java实现打印正三角的具体代码,供大家参考,具体内容如下 代码: package BasicType; /** * 封装一个可以根据用户传入值来打印正三角的方法 * @autho ...
- 使用java实现打印功能_java实现打印功能有没有比较好的方式?
Java 实现打印文件 Java 原生打印: 有一下几种实现方式: 实现打印对象:实现Printable接口 使用工具箱自带的打印对象(Toolkit.getDefaultToolkit().getP ...
- java 计算i 出现的次数_JAVA算法:按照给定的段落统计单词出现次数(JAVA代码)...
https://blog.csdn.net/seagal890/article/details/92067644 JAVA算法:按照给定的段落统计单词出现次数(JAVA代码) 写一个 JAVA程序以统 ...
- java打印数组_Java中打印数组内容的方式有哪些?
下面是几种常见的打印方式. 方法一:使用循环打印. public class Demo { public static void main(String[] args) { String[] info ...
- java 网络通讯用什么流_Java中打印流,网络通信协议,TCP通信的基础介绍
1-1.打印流 java.io.PrintStream:打印流 PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式. PrintStream特点: 1).只负责数据 ...
- java打印三角形_java基础打印三角形
/* 实心等边三角形 */ class Triangle2{ public static void main(String[] args){ int n=5; for(int i=0;i for(in ...
- java生成指定长度的空格_java如何打印出任意给定的空格
展开全部 可以使用String.format(String format,Object...args);进行格式化字符串,然后打e68a8462616964757a686964616f31333363 ...
最新文章
- GitHub告急!黑客威胁程序员不交钱就删库
- 客户端修改文件服务器密码,客户端服务器登录 密码问题
- Oracle 表数据去重
- windows+nginx负载测试
- vue项目引入字体图标iconfont
- 前端转行大数据?没必要
- 数学公式识别:基于编码-解码模型
- java系列3:数组初始化(基本格式)
- Centos7-Mysql-5.6.41一主两从的搭建
- linux shell中实现循环日期的实例代码
- 【Python】【有趣的模块】【systimeos】
- Go 设计模式(Go patterns)
- 安卓模拟器刷小米系统_小米5x原生rom系统刷机-小米5X MIUI10刷机包下载V9.7.21最新版-西西软件下载...
- 【转】Ubuntu下用G++编译C++程序
- 神经网络算法实例应用题,神经网络算法实例应用
- DWM 层 -- 访客 UV 计算
- 基于树莓派实现简易-智能家居
- 线下 Meetup 预告|从原理到实战,详解 Database Plus 的互联网最佳实践
- Windows下编译语音识别引擎Wenet
- 车牌识别 瞬间启动 快速抓拍 超低功耗 的4G智能摄像头方案