首先,不要使用窗格大小,您需要充当布局管理器并调整面板大小以适合页面。
其次,不要使用缓冲图像。这将不会与打印引擎过去给您的图形上下文共享相同的属性。此外,另一种印刷方法重入的,这意味着它可以被称为多次,为每个页面,创建一个缓冲的形象这样是对资源的浪费
你可能想看看How to Print Tables
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;
}
只是要小心,这可能会对您的截断表的潜力。此外,您不应该使用屏幕上已有的Component
。您应该创建一个新的“打印”组件。
更新与工作示例
好了,所以是合理的,只是需要一些调整,以得到它的工作理念;)
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();
}
}
}
@kleopatra你是什么意思通过重新发明轮子? –
oops ...没有读你的第一句话;-) – kleopatra
我的潜意识自我可能被认为是沿着http://stackoverflow.com/a/6343475/203657的行 - 这是实现委托打印,调整纸张设置(没有尝试,但预计会使它适用于两个表格) – kleopatra