java怎么控制页面打印次数_java – 控制打印页面上面板的大小

本文主要讨论如何解决在Java中使用JPanel打印时出现的图像精度问题和控制面板在打印页面上的大小。通过设置PrinterJob、Paper和PageFormat,以及调整组件大小来适应页面,并提供了一个工作示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想用两张桌子打印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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值