Java-在同一页中使用不同字体打印标题
我想用不同的字体打印两个标题,然后用另一种字体打印表格标题和所有行。我在Java-在同一页中使用不同字体打印标题,java,swing,printing,Java,Swing,Printing,我想用不同的字体打印两个标题,然后用另一种字体打印表格标题和所有行。我在JTable中有表内容。当用户单击按钮时,我想将所有内容发送到PrinterServices,并以横向方向打印它们。可能有很多行,所以我需要分页。分页在左下角 我发现无法使用JTable.print,因为我需要font1中的标题、font2中的副标题以及font3中的表头/表格数据 我该怎么做 我看过这一页,向我展示了如何在几页中以不同的样式打印: 但是我认为这个链接将不同的样式放在不同的页面中,在我的情况下,title1
JTable
中有表内容。当用户单击按钮时,我想将所有内容发送到PrinterServices
,并以横向
方向打印它们。可能有很多行,所以我需要分页。分页在左下角
我发现无法使用JTable.print
,因为我需要font1
中的标题、font2
中的副标题以及font3
中的表头/表格数据
我该怎么做
我看过这一页,向我展示了如何在几页中以不同的样式打印:
但是我认为这个链接将不同的样式放在不同的页面中,在我的情况下,title1
和title2
在第一页,页面的其余部分填充了行数据,然后是第2页,第3页。。。因此,它在同一个页面中包含多个样式,并且与链接的功能不完全相同
编辑:
现在我有了这些代码,但它们在两个方面不起作用:
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import javax.print.attribute.HashPrintRequestAttributeSet;
import javax.print.attribute.PrintRequestAttributeSet;
public class PrintingTest1 {
/**
* @param args
*/
public static void main(String[] args) {
PrinterJob job = PrinterJob.getPrinterJob();
//cross-platform print dialog, java l&f
// PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
//java page setup dialog
// PageFormat pf = job.getPageFormat(aset);
// job.setPrintable(new PrintingTest1().new HelloWorldPrinter(), pf);
//java print setup dialog
// boolean doPrint = job.printDialog(aset);
// if (doPrint) {
// try {
// job.print(aset);
// } catch (PrinterException e) {
// System.out.println("Cancelled. ");
// }
// }
//native print dialog
PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet();
Font font1 = new Font("Courier New", Font.PLAIN, 12);
Font font2 = new Font("Courier New", Font.PLAIN, 10);
Font font3 = new Font("Courier New", Font.PLAIN, 9);
HelloWorldPrinter printer = new PrintingTest1().new HelloWorldPrinter();
printer.setFont1(font1);
printer.setFont2(font2);
printer.setFont3(font3);
printer.setTitle1("Title 1: Main title");
printer.setTitle2line1("Title 2 line 1: top");
printer.setTitle2line2("Title 2 line 2: bot");
printer.setHeaderline1("HeaderLine1: top");
printer.setHeaderline2("HeaderLine2: bot");
String[][] rows = new String[85][2];
for (int i=0; i<rows.length; i++) {
rows[i] = new String[] {"row " + i + ", line 1", " row " + i + ", line 2"};
}
printer.setRows(rows.length);
printer.setRowsData(rows);
job.setPrintable(printer);
boolean doPrint = job.printDialog();
if (doPrint) {
try {
job.print();
} catch (PrinterException e) {
System.out.println("Cancelled. ");
}
}
}
class HelloWorldPrinter implements Printable {
private Font font1;
private Font font2;
private Font font3;
private int lineHeight1;
private int lineHeight2;
private int lineHeight3;
private String title1;
private String title2line1;
private String title2line2;
private String headerline1;
private String headerline2;
private String[][] rowsData;
/**
* Number of rows in the table
*/
private int rows;
/**
* Number of lines of data to print. 2*rows.
*/
private int dataLines;
private int pageLimit;
private int linesDataOnPage0;
private int linesOnPage0;
private int linesPerPage;
/**
* The array index of row data when every new pages starts to print.
*/
private int newStartIndex;
public void setRows(int rows) {
this.rows = rows;
}
public void setFont1(Font font1) {
this.font1 = font1;
}
public void setFont2(Font font2) {
this.font2 = font2;
}
public void setFont3(Font font3) {
this.font3 = font3;
}
public void setTitle1(String title1) {
this.title1 = title1;
}
public void setTitle2line1(String title2line1) {
this.title2line1 = title2line1;
}
public void setTitle2line2(String title2line2) {
this.title2line2 = title2line2;
}
public void setHeaderline1(String headerline1) {
this.headerline1 = headerline1;
}
public void setHeaderline2(String headerline2) {
this.headerline2 = headerline2;
}
public void setRowsData(String[][] rowsData) {
this.rowsData = rowsData;
}
public HelloWorldPrinter() {
// TODO Auto-generated constructor stub
}
private int calculatePageLimit(int dataLines, Graphics g, PageFormat pf) {
FontMetrics metrics1 = g.getFontMetrics(font1);
FontMetrics metrics2 = g.getFontMetrics(font2);
FontMetrics metrics3 = g.getFontMetrics(font3);
lineHeight1 = metrics1.getHeight();
lineHeight2 = metrics2.getHeight();
lineHeight3 = metrics3.getHeight();
double pageHeight = pf.getImageableHeight();
//title 1, title 2 (2 lines), header (2 lines)
linesDataOnPage0 = (int)((pageHeight - lineHeight1 - lineHeight2*2 - lineHeight3*2) / lineHeight3);
linesOnPage0 = linesDataOnPage0 + 5;
linesPerPage = (int)pageHeight / lineHeight3;
int pageLimit0 = 0;
if (dataLines <= linesDataOnPage0) {
pageLimit0 = 1; //all data can be printed on the first page.
} else {
int lastPageLines = (dataLines - linesDataOnPage0) % linesPerPage;
pageLimit0 = (dataLines - linesDataOnPage0 - lastPageLines) / linesPerPage + 2;
}
return pageLimit0;
}
@Override
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
if (pageLimit == 0) { //not calculated yet.
this.dataLines = rows * 2;
pageLimit = calculatePageLimit(dataLines, graphics, pageFormat);
}
Paper papel = new Paper();
papel.setImageableArea(72, 72, 697, 450);
papel.setSize(841, 595);
pageFormat.setPaper(papel);
pageFormat.setOrientation(PageFormat.LANDSCAPE);
Graphics2D g2d = (Graphics2D)graphics;
g2d.translate(pageFormat.getImageableX(), pageFormat.getImageableY());
if (pageIndex < pageLimit) {
int y = 10;
if (pageIndex == 0) {
// 1. print the title 1
g2d.setFont(font1);
g2d.drawString(title1, 10, y);
y += lineHeight1;
// 2. print title 2
g2d.setFont(font2);
g2d.drawString(title2line1, 10, y);
y += lineHeight2;
g2d.drawString(title2line2, 10, y);
y += lineHeight2;
// 3. print header
g2d.setFont(font3);
g2d.drawString(headerline1, 10, y);
y += lineHeight3;
g2d.drawString(headerline2, 10, y);
y += lineHeight3;
// 4. print data
for (int i=0; i< (int)(linesDataOnPage0 / 2); i++) {
g2d.drawString(rowsData[i][0], 10, y);
y += lineHeight3;
g2d.drawString(rowsData[i][1], 10, y);
y += lineHeight3;
}
y = 0;
newStartIndex = (int)(linesDataOnPage0 / 2);
return PAGE_EXISTS;
} else {
int end;
if (newStartIndex + (int)(linesPerPage / 2) > rowsData.length) {
end = rowsData.length;
} else {
end = newStartIndex + (int)(linesPerPage / 2);
}
g2d.setFont(font3);
for (int i=newStartIndex; i< end; i++) {
g2d.drawString(rowsData[i][0], 10, y);
y += lineHeight3;
g2d.drawString(rowsData[i][1], 10, y);
y += lineHeight3;
}
y = 0;
newStartIndex +=(int)(linesPerPage / 2);
return PAGE_EXISTS;
}
} else {
return NO_SUCH_PAGE;
}
}
}
}
导入java.awt.Font;
导入java.awt.FontMetrics;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.print.PageFormat;
导入java.awt.print.Paper;
导入java.awt.print.Printable;
导入java.awt.print.PrinterException;
导入java.awt.print.PrinterJob;
导入javax.print.attribute.HashPrintRequestAttributeSet;
导入javax.print.attribute.PrintRequestAttributeSet;
公共类打印测试1{
/**
*@param args
*/
公共静态void main(字符串[]args){
PrinterJob job=PrinterJob.getPrinterJob();
//跨平台打印对话框,java l&f
//PrintRequestAttributeSet aset=新的HashPrintRequestAttributeSet();
//java页面设置对话框
//PageFormat pf=job.getPageFormat(aset);
//作业.setPrintable(新的PrintingTest1().新的HelloWorldPrinter(),pf);
//java打印设置对话框
//布尔doPrint=job.printDialog(aset);
//if(doPrint){
//试一试{
//打印作业(aset);
//}catch(PrinterException e){
//System.out.println(“取消”);
// }
// }
//本机打印对话框
PrintRequestAttributeSet aset=新的HashPrintRequestAttributeSet();
Font font1=新字体(“Courier new”,Font.PLAIN,12);
Font font2=新字体(“Courier new”,Font.PLAIN,10);
Font font3=新字体(“Courier new”,Font.PLAIN,9);
HelloWorldPrinter printer=新打印测试1()。新HelloWorldPrinter();
打印机。setFont1(font1);
打印机。setFont2(font2);
打印机。setFont3(font3);
打印机。设置标题1(“标题1:主标题”);
打印机。设置标题2行1(“标题2行1:顶部”);
打印机。设置标题2行2(“标题2行2:bot”);
打印机.setHeaderline1(“HeaderLine1:top”);
打印机.setHeaderline2(“HeaderLine2:bot”);
字符串[][]行=新字符串[85][2];
对于(int i=0;我可能会发布一些代码,并展示一个示例来说明你的意思。在这种情况下,如果没有可视化,很难理解。我会推荐类似Jasper Reports的内容,谢谢你的回答。我已经编辑了问题以显示更多代码。如果有人想结束问题,请留下评论来解释你自己如果你不介意的话,请尊重我。