巨爽!!!jdbtable 的分页打印和分页预览终于搞定了。 散分 能不能介绍一下怎么搞定的?还有就是你的方法能不能移植到jsp中来? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 jsp 当然不行呀,JSP到浏览器是已经是HTML文本了,他怎么还会与JAVA有关呢当然,如果是APPLET的话,当然可以呀 是我没说清楚我想问一下jsp下的分页打印和分页预览可不可以借用一下你的思路^_^ 恭喜,能不能给我一份源代码!我也正在做打印程序。多谢!!!my eMail: [email protected] 源码能不能发给我,谢谢。[email protected] package com.tbr.app.print;import java.awt.event.*;import java.awt.*;import java.awt.print.*;import javax.swing.*;import java.awt.geom.*;/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author unascribed * @version 1.0 */public class PrintPreviewDialog extends JDialog implements ActionListener{ private JButton nextButton = new JButton("后一页"); private JButton previousButton = new JButton("前一页"); private JButton closeButton = new JButton("关闭"); private JPanel buttonPanel = new JPanel(); private PreviewCanvas canvas; public PrintPreviewDialog(Frame parent, String title, boolean modal, Printable pt){ super(parent, title, modal); canvas = new PreviewCanvas(pt); setLayout(); } private void setLayout(){ this.getContentPane().setLayout(new BorderLayout()); this.getContentPane().add(canvas, BorderLayout.CENTER); nextButton.setMnemonic('N'); nextButton.addActionListener(this); buttonPanel.add(nextButton); previousButton.setMnemonic('N'); previousButton.addActionListener(this); buttonPanel.add(previousButton); closeButton.setMnemonic('N'); closeButton.addActionListener(this); buttonPanel.add(closeButton); this.getContentPane().add(buttonPanel, BorderLayout.EAST); java.awt.Dimension size=java.awt.Toolkit.getDefaultToolkit().getScreenSize(); size.width-=100; size.height-=30; this.setSize(size); } public void actionPerformed(ActionEvent evt){ Object src = evt.getSource(); if (src == nextButton) nextAction(); else if (src == previousButton) previousAction(); else if (src == closeButton) closeAction(); } private void closeAction(){ this.setVisible(false); this.dispose(); } private void nextAction(){ canvas.viewPage(1); } private void previousAction(){ canvas.viewPage(-1); } class PreviewCanvas extends JPanel{ private int currentPage = 0; private Printable preview; private int pagecount=0; public PreviewCanvas(Printable pt){ this.pagecount = 9999; preview = pt; } public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2 = (Graphics2D)g; PageFormat pf = PrinterJob.getPrinterJob().defaultPage(); double xoff; double yoff; double scale; double px = pf.getWidth(); double py = pf.getHeight(); double sx = getWidth() - 1; double sy = getHeight() - 1; if (px / py < sx / sy){ scale = sy / py; xoff = 0.5 * (sx - scale * px); yoff = 0; }else{ scale = sx / px; xoff = 0; yoff = 0.5 * (sy - scale * py); } g2.translate((float)xoff, (float)yoff); g2.scale((float)scale, (float)scale); Rectangle2D page = new Rectangle2D.Double(0, 0, px, py); g2.setPaint(Color.white); g2.fill(page); g2.setPaint(Color.black); g2.draw(page); try{ if (preview.print(g2, pf, currentPage)==Printable.NO_SUCH_PAGE){ this.currentPage--; this.pagecount=currentPage+1; } }catch(PrinterException pe){ g2.draw(new Line2D.Double(0, 0, px, py)); g2.draw(new Line2D.Double(0, px, 0, py)); } } public void viewPage(int pos){ int newPage = currentPage + pos; if (0 <= newPage && newPage < pagecount){ currentPage = newPage; repaint(); } } }} import com.borland.dbswing.JdbTable;import com.borland.dbswing.DBExceptionHandler;import com.borland.dbswing.DBTableModel;import javax.swing.*;import com.borland.dx.dataset.*;import javax.swing.table.*;import com.borland.dx.text.*;import javax.swing.table.*;import java.awt.*;import java.awt.geom.*;import java.awt.print.*;import com.tbr.app.print.*;/** * <p>Title: </p> * <p>Description: </p> * <p>Copyright: Copyright (c) 2003</p> * <p>Company: </p> * @author unascribed * @version 1.0 */public class MydbTable extends JdbTable implements java.awt.print.Printable { final static Color bg = Color.white; final static Color fg = Color.black; final static Color red = Color.red; final static Color white = Color.white; final static BasicStroke stroke = new BasicStroke(2.0f); final static BasicStroke wideStroke = new BasicStroke(8.0f); final static float dash1[] = {10.0f}; final static BasicStroke dashed = new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f); final static JButton button = new JButton("Print"); /** * <p>Creates <code>JdbTable</code>'s default right-click popup menu.</p> * @return The popup menu. */ protected JPopupMenu createPopupMenu() { JPopupMenu menu = new JPopupMenu(); menu.setDefaultLightWeightPopupEnabled(false); JMenuItem menuItem;// JMenu sortMenu = new JMenu(Res._SortBy); JMenu sortMenu = new JMenu("排序"); if (this.getDataSet().isEditing()) { sortMenu.setEnabled(false); }// JCheckBoxMenuItem checkItem = new JCheckBoxMenuItem(Res._Unsorted); JCheckBoxMenuItem checkItem = new JCheckBoxMenuItem("取消排序"); checkItem.addActionListener(this); checkItem.setActionCommand("nosort"); SortDescriptor sortDescriptor = this.getDataSet().getSort(); String columnSortKey = ""; if (sortDescriptor == null) { checkItem.setState(true); } else { String [] sortKeys; if ((sortKeys = sortDescriptor.getKeys()) != null && sortKeys.length > 0) { columnSortKey = sortKeys[0]; } } sortMenu.add(checkItem); String columnName; for (int colNo = 0, maxCols = getColumnModel().getColumnCount(); colNo < maxCols; colNo++) { Column dataSetColumn = ((DBTableModel) getModel()).getColumn(convertColumnIndexToModel(colNo));// System.out.println(dataSetColumn.getColumnName()); if (dataSetColumn == null || !this.getDataSet().isSortable(dataSetColumn)) { continue; } TableColumn column = getColumnModel().getColumn(colNo); if (column.getHeaderValue() instanceof String []) { checkItem = new JCheckBoxMenuItem(getConcatenatedString((String []) column.getHeaderValue())); } else { checkItem = new JCheckBoxMenuItem(column.getHeaderValue().toString().replace('\n', ' ')); } checkItem.addActionListener(this); columnName = getColumnModel().getColumn(colNo).getIdentifier().toString(); checkItem.setActionCommand(columnName); if (columnSortKey.equals(columnName)) { checkItem.setState(true); } else { checkItem.setState(false); } sortMenu.add(checkItem); } menu.add(sortMenu); menu.addSeparator(); boolean readOnly = false; if (this.getDataSet() instanceof StorageDataSet) { readOnly = ((StorageDataSet) this.getDataSet()).isReadOnly(); }// menuItem = new JMenuItem(Res._Post); menuItem = new JMenuItem("发送改变到当前行"); menuItem.setEnabled(this.getDataSet().isEditing()); menuItem.addActionListener(this); menuItem.setActionCommand("post"); menu.add(menuItem);// menuItem = new JMenuItem(Res._Cancel); menuItem = new JMenuItem("取消改变当前行"); menuItem.setEnabled(this.getDataSet().isEditing()); menuItem.addActionListener(this); menuItem.setActionCommand("cancel"); menu.add(menuItem);// menuItem = new JMenuItem(Res._Insert); menuItem = new JMenuItem("添加新数据行"); menuItem.setEnabled(this.getDataSet().isEnableInsert() && isEditable() && !this.getDataSet().isEditingNewRow() && this.getDataSet().isEditable() && !readOnly); menuItem.addActionListener(this); menuItem.setActionCommand("insert"); menu.add(menuItem);// menuItem = new JMenuItem(Res._Delete); menuItem = new JMenuItem("删除当前数据行"); try { menuItem.setEnabled(this.getDataSet().isEnableDelete() && isEditable() && !this.getDataSet().isEmpty() && this.getDataSet().isEditable() && !readOnly); menuItem.addActionListener(this); menuItem.setActionCommand("delete"); menu.add(menuItem); } catch (DataSetException e) { DBExceptionHandler.handleException(this.getDataSet(), this, e); } return menu; } private String getConcatenatedString(String [] strings) { StringBuffer caption = new StringBuffer(); for (int i = 0; i < strings.length; i++) { caption.append(strings[i]).append(" "); } caption.deleteCharAt(caption.length() - 1); return caption.toString(); } public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) {//System.out.println("print("+pageIndex+")"); Graphics2D g2 = (Graphics2D) graphics; JTable tableView=this; g2.setColor(Color.black); int fontHeight=g2.getFontMetrics().getHeight(); int fontDesent=g2.getFontMetrics().getDescent(); int pageHeight = (int)pageFormat.getImageableHeight()-fontHeight; int pageWidth = (int)pageFormat.getImageableWidth(); int tableWidth = tableView.getColumnModel().getTotalColumnWidth(); int [][] clnpages=this.getPageColumnWidthPos((int)pageWidth); int pagecolumnForTable=clnpages.length; int rowMargin=tableView.getRowMargin(); int headerHeightOnPage=(tableView.getTableHeader().getHeight()); int oneRowHeight=tableView.getRowHeight(); int numRowsOnAPage=(pageHeight-headerHeightOnPage)/oneRowHeight; double pageHeightForTable=oneRowHeight*numRowsOnAPage; int pagerowForTable=(tableView.getRowCount()+numRowsOnAPage-1)/numRowsOnAPage;//System.out.println(pagerowForTable+"|"+pagecolumnForTable); int totalNumPages= pagerowForTable*pagecolumnForTable;// System.out.println(totalNumPages); if(pageIndex>=totalNumPages) { return NO_SUCH_PAGE; } g2.translate(pageFormat.getImageableX(),pageFormat.getImageableY()); g2.drawString("第"+(pageIndex+1)+"页/共"+totalNumPages+"页",(int)pageWidth/2-35, (int)(pageHeight+fontHeight-fontDesent));//bottom center //If this piece of the table is smaller than the size available, //clip to the appropriate bounds. int pagecolumn=pageIndex/pagerowForTable; int pagerow=pageIndex%pagerowForTable; g2.translate(-clnpages[pagecolumn][0], 0);//设置头的水平偏移量 g2.setClip(clnpages[pagecolumn][0], 0,clnpages[pagecolumn][1], (int)Math.ceil(headerHeightOnPage)); tableView.getTableHeader().paint(g2);//paint header at top g2.translate(0f,headerHeightOnPage);//跳过头 g2.translate(0f,-pagerow*pageHeightForTable);//设置打印页所在TABLE中的垂直偏移量 if (pagerow + 1 == pagerowForTable) { double lastRowPrinted = numRowsOnAPage * pagerow; double numRowsLeft = tableView.getRowCount() - lastRowPrinted; g2.setClip(clnpages[pagecolumn][0], (int)(pageHeightForTable * pagerow), clnpages[pagecolumn][1], (int) Math.ceil(oneRowHeight * numRowsLeft+rowMargin)); } //else clip to the entire area available. else{ g2.setClip(clnpages[pagecolumn][0], (int)(pageHeightForTable*pagerow), clnpages[pagecolumn][1], (int) Math.ceil(pageHeightForTable+rowMargin)); } tableView.paint(g2); return Printable.PAGE_EXISTS; } private int[][] getPageColumnWidthPos(int pagewidth){ TableColumnModel cm=this.getColumnModel(); int cnt=cm.getColumnCount(); java.util.Vector vt=new java.util.Vector(); int w=0,x=0,currentpagewidth=0; int[] nextpagepos; for(int i=0;i<cnt;i++){ w=cm.getColumn(i).getWidth(); if (currentpagewidth+w>pagewidth){ if (currentpagewidth>0){ nextpagepos=new int[2]; nextpagepos[0]=x; x+=currentpagewidth; nextpagepos[1]=currentpagewidth; vt.add(nextpagepos); } while(w>=pagewidth){ nextpagepos=new int[2]; nextpagepos[0]=x; x+=pagewidth; nextpagepos[1]=pagewidth; vt.add(nextpagepos); w-=pagewidth; } currentpagewidth=w; }else{ currentpagewidth+=w; } } if (currentpagewidth>0){ nextpagepos=new int[2]; nextpagepos[0]=x; x+=currentpagewidth; nextpagepos[1]=x; vt.add(nextpagepos); } int[][] ret=new int[vt.size()][]; vt.toArray(ret); return ret; } private int printPageCount(Graphics graphics){ PageFormat pageFormat=PrinterJob.getPrinterJob().defaultPage(); Graphics2D g2 = (Graphics2D) graphics; JTable tableView=this; g2.setColor(Color.black); int fontHeight=g2.getFontMetrics().getHeight(); int fontDesent=g2.getFontMetrics().getDescent(); int pageHeight = (int)pageFormat.getImageableHeight()-fontHeight; int pageWidth = (int)pageFormat.getImageableWidth(); int tableWidth = tableView.getColumnModel().getTotalColumnWidth(); int [][] clnpages=this.getPageColumnWidthPos((int)pageWidth); int pagecolumnForTable=clnpages.length; int rowMargin=tableView.getRowMargin(); int headerHeightOnPage=(tableView.getTableHeader().getHeight()); int oneRowHeight=tableView.getRowHeight(); int numRowsOnAPage=(pageHeight-headerHeightOnPage)/oneRowHeight; int pageHeightForTable=oneRowHeight*numRowsOnAPage; int pagerowForTable=(tableView.getRowCount()+numRowsOnAPage-1)/numRowsOnAPage; int totalNumPages= pagerowForTable*pagecolumnForTable; return totalNumPages; } public void print(){ java.awt.print.PrinterJob job=java.awt.print.PrinterJob.getPrinterJob(); job.setPrintable(this); if (job.printDialog()){ try{ job.print(); }catch (Exception exc){ } } } public void printPreview(){ PrintPreviewDialog ppd=new PrintPreviewDialog(null,"打印预览",true,this); ppd.show(); }} 对 tanghuan的这种做法我表示巨支持和感谢。如果有一天我成为了这样的高手,我将一定仿效tanghuan的英雄般的举动。 打印和预览一直是JAVA的痛,虽然这个是很小的一点,但可以给其他人以帮助和启发,用在其他地方,或者改的更好,建议斑竹放在FAQ中,可以给更多人带来方便,大家看如何 回复人: tanghuan() ( ) 信誉:99 2003-09-27 12:06:00 得分:0 打印和预览一直是JAVA的痛,虽然这个是很小的一点,但可以给其他人以帮助和启发,用在其他地方,或者改的更好,建议斑竹放在FAQ中,可以给更多人带来方便,大家看如何 支持! 支持! [email protected]有time发份资料过来 谢谢你csdn需要你及我不知道的作者们 没有你们哪会有csdn的好日子过呀! 先恭喜啊!!!能不能得到源代码??邮箱:[email protected] 深夜分享一个Java写的为图片添加水印的软件(含源代码)(小小菜鸟) paint(graphics g) 参数传递 java 开始DB transaction 之后 执行system.exit,结果? 高手来看一下(难度五星) 页面显示效果 MySql安装完毕(win2000)一定要执行“winmysqladmin.exe”激活mysql服务么? 一个表格和几个按钮布局的问题? 用java写的桌面应用程序,文字显示不正常!!求助 大家知道这个图是怎么画出来的么 java for 循环截取字符串 java 中文帮助文档。谁有吗? 关于JCreator的使用!
我想问一下jsp下的分页打印和分页预览可不可以借用一下你的思路
^_^
多谢!!!
my eMail: [email protected]
[email protected]
import java.awt.event.*;
import java.awt.*;
import java.awt.print.*;
import javax.swing.*;
import java.awt.geom.*;
/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/public class PrintPreviewDialog extends JDialog
implements ActionListener
{
private JButton nextButton = new JButton("后一页");
private JButton previousButton = new JButton("前一页");
private JButton closeButton = new JButton("关闭");
private JPanel buttonPanel = new JPanel();
private PreviewCanvas canvas; public PrintPreviewDialog(Frame parent, String title, boolean modal,
Printable pt){
super(parent, title, modal);
canvas = new PreviewCanvas(pt);
setLayout();
} private void setLayout(){
this.getContentPane().setLayout(new BorderLayout());
this.getContentPane().add(canvas, BorderLayout.CENTER);
nextButton.setMnemonic('N');
nextButton.addActionListener(this);
buttonPanel.add(nextButton);
previousButton.setMnemonic('N');
previousButton.addActionListener(this);
buttonPanel.add(previousButton);
closeButton.setMnemonic('N');
closeButton.addActionListener(this);
buttonPanel.add(closeButton);
this.getContentPane().add(buttonPanel, BorderLayout.EAST);
java.awt.Dimension size=java.awt.Toolkit.getDefaultToolkit().getScreenSize();
size.width-=100;
size.height-=30;
this.setSize(size);
} public void actionPerformed(ActionEvent evt){
Object src = evt.getSource();
if (src == nextButton)
nextAction();
else if (src == previousButton)
previousAction();
else if (src == closeButton)
closeAction();
} private void closeAction(){
this.setVisible(false);
this.dispose();
} private void nextAction(){
canvas.viewPage(1);
} private void previousAction(){
canvas.viewPage(-1);
} class PreviewCanvas extends JPanel{
private int currentPage = 0;
private Printable preview;
private int pagecount=0; public PreviewCanvas(Printable pt){
this.pagecount = 9999;
preview = pt;
} public void paintComponent(Graphics g){
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
PageFormat pf = PrinterJob.getPrinterJob().defaultPage(); double xoff;
double yoff;
double scale;
double px = pf.getWidth();
double py = pf.getHeight();
double sx = getWidth() - 1;
double sy = getHeight() - 1;
if (px / py < sx / sy){
scale = sy / py;
xoff = 0.5 * (sx - scale * px);
yoff = 0;
}else{
scale = sx / px;
xoff = 0;
yoff = 0.5 * (sy - scale * py);
}
g2.translate((float)xoff, (float)yoff);
g2.scale((float)scale, (float)scale); Rectangle2D page = new Rectangle2D.Double(0, 0, px, py);
g2.setPaint(Color.white);
g2.fill(page);
g2.setPaint(Color.black);
g2.draw(page); try{
if (preview.print(g2, pf, currentPage)==Printable.NO_SUCH_PAGE){
this.currentPage--;
this.pagecount=currentPage+1;
} }catch(PrinterException pe){
g2.draw(new Line2D.Double(0, 0, px, py));
g2.draw(new Line2D.Double(0, px, 0, py));
}
} public void viewPage(int pos){
int newPage = currentPage + pos;
if (0 <= newPage && newPage < pagecount){
currentPage = newPage;
repaint();
}
}
}
}
import com.borland.dbswing.DBExceptionHandler;
import com.borland.dbswing.DBTableModel;import javax.swing.*;
import com.borland.dx.dataset.*;
import javax.swing.table.*;
import com.borland.dx.text.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.print.*;
import com.tbr.app.print.*;/**
* <p>Title: </p>
* <p>Description: </p>
* <p>Copyright: Copyright (c) 2003</p>
* <p>Company: </p>
* @author unascribed
* @version 1.0
*/public class MydbTable extends JdbTable implements java.awt.print.Printable {
final static Color bg = Color.white;
final static Color fg = Color.black;
final static Color red = Color.red;
final static Color white = Color.white; final static BasicStroke stroke = new BasicStroke(2.0f);
final static BasicStroke wideStroke = new BasicStroke(8.0f); final static float dash1[] = {10.0f};
final static BasicStroke dashed = new BasicStroke(1.0f, BasicStroke.CAP_BUTT,
BasicStroke.JOIN_MITER, 10.0f, dash1, 0.0f);
final static JButton button = new JButton("Print");
/**
* <p>Creates <code>JdbTable</code>'s default right-click popup menu.</p>
* @return The popup menu.
*/ protected JPopupMenu createPopupMenu() { JPopupMenu menu = new JPopupMenu();
menu.setDefaultLightWeightPopupEnabled(false); JMenuItem menuItem;// JMenu sortMenu = new JMenu(Res._SortBy);
JMenu sortMenu = new JMenu("排序"); if (this.getDataSet().isEditing()) {
sortMenu.setEnabled(false);
}// JCheckBoxMenuItem checkItem = new JCheckBoxMenuItem(Res._Unsorted);
JCheckBoxMenuItem checkItem = new JCheckBoxMenuItem("取消排序");
checkItem.addActionListener(this);
checkItem.setActionCommand("nosort");
SortDescriptor sortDescriptor = this.getDataSet().getSort();
String columnSortKey = "";
if (sortDescriptor == null) {
checkItem.setState(true);
}
else {
String [] sortKeys;
if ((sortKeys = sortDescriptor.getKeys()) != null && sortKeys.length > 0) {
columnSortKey = sortKeys[0];
}
}
sortMenu.add(checkItem);
String columnName;
for (int colNo = 0, maxCols = getColumnModel().getColumnCount(); colNo < maxCols; colNo++) {
Column dataSetColumn = ((DBTableModel) getModel()).getColumn(convertColumnIndexToModel(colNo));
// System.out.println(dataSetColumn.getColumnName());
if (dataSetColumn == null || !this.getDataSet().isSortable(dataSetColumn)) {
continue;
}
TableColumn column = getColumnModel().getColumn(colNo);
if (column.getHeaderValue() instanceof String []) {
checkItem = new JCheckBoxMenuItem(getConcatenatedString((String []) column.getHeaderValue()));
}
else {
checkItem = new JCheckBoxMenuItem(column.getHeaderValue().toString().replace('\n', ' '));
}
checkItem.addActionListener(this);
columnName = getColumnModel().getColumn(colNo).getIdentifier().toString();
checkItem.setActionCommand(columnName);
if (columnSortKey.equals(columnName)) {
checkItem.setState(true);
}
else {
checkItem.setState(false);
}
sortMenu.add(checkItem);
} menu.add(sortMenu); menu.addSeparator(); boolean readOnly = false;
if (this.getDataSet() instanceof StorageDataSet) {
readOnly = ((StorageDataSet) this.getDataSet()).isReadOnly();
}
// menuItem = new JMenuItem(Res._Post);
menuItem = new JMenuItem("发送改变到当前行");
menuItem.setEnabled(this.getDataSet().isEditing());
menuItem.addActionListener(this);
menuItem.setActionCommand("post");
menu.add(menuItem);// menuItem = new JMenuItem(Res._Cancel);
menuItem = new JMenuItem("取消改变当前行");
menuItem.setEnabled(this.getDataSet().isEditing());
menuItem.addActionListener(this);
menuItem.setActionCommand("cancel");
menu.add(menuItem);// menuItem = new JMenuItem(Res._Insert);
menuItem = new JMenuItem("添加新数据行");
menuItem.setEnabled(this.getDataSet().isEnableInsert() && isEditable() && !this.getDataSet().isEditingNewRow() && this.getDataSet().isEditable() && !readOnly);
menuItem.addActionListener(this);
menuItem.setActionCommand("insert");
menu.add(menuItem);// menuItem = new JMenuItem(Res._Delete);
menuItem = new JMenuItem("删除当前数据行");
try {
menuItem.setEnabled(this.getDataSet().isEnableDelete() && isEditable() && !this.getDataSet().isEmpty() && this.getDataSet().isEditable() && !readOnly);
menuItem.addActionListener(this);
menuItem.setActionCommand("delete");
menu.add(menuItem);
}
catch (DataSetException e) {
DBExceptionHandler.handleException(this.getDataSet(), this, e);
}
return menu; } private String getConcatenatedString(String [] strings) {
StringBuffer caption = new StringBuffer();
for (int i = 0; i < strings.length; i++) {
caption.append(strings[i]).append(" ");
}
caption.deleteCharAt(caption.length() - 1);
return caption.toString();
}
PageFormat pageFormat,
int pageIndex) {
//System.out.println("print("+pageIndex+")");
Graphics2D g2 = (Graphics2D) graphics;
JTable tableView=this;
g2.setColor(Color.black);
int fontHeight=g2.getFontMetrics().getHeight();
int fontDesent=g2.getFontMetrics().getDescent(); int pageHeight = (int)pageFormat.getImageableHeight()-fontHeight;
int pageWidth = (int)pageFormat.getImageableWidth();
int tableWidth = tableView.getColumnModel().getTotalColumnWidth();
int [][] clnpages=this.getPageColumnWidthPos((int)pageWidth);
int pagecolumnForTable=clnpages.length;
int rowMargin=tableView.getRowMargin();
int headerHeightOnPage=(tableView.getTableHeader().getHeight());
int oneRowHeight=tableView.getRowHeight();
int numRowsOnAPage=(pageHeight-headerHeightOnPage)/oneRowHeight;
double pageHeightForTable=oneRowHeight*numRowsOnAPage; int pagerowForTable=(tableView.getRowCount()+numRowsOnAPage-1)/numRowsOnAPage;
//System.out.println(pagerowForTable+"|"+pagecolumnForTable);
int totalNumPages= pagerowForTable*pagecolumnForTable;
// System.out.println(totalNumPages);
if(pageIndex>=totalNumPages) {
return NO_SUCH_PAGE;
} g2.translate(pageFormat.getImageableX(),pageFormat.getImageableY());
g2.drawString("第"+(pageIndex+1)+"页/共"+totalNumPages+"页",(int)pageWidth/2-35,
(int)(pageHeight+fontHeight-fontDesent));//bottom center //If this piece of the table is smaller than the size available,
//clip to the appropriate bounds.
int pagecolumn=pageIndex/pagerowForTable;
int pagerow=pageIndex%pagerowForTable; g2.translate(-clnpages[pagecolumn][0], 0);//设置头的水平偏移量
g2.setClip(clnpages[pagecolumn][0], 0,clnpages[pagecolumn][1],
(int)Math.ceil(headerHeightOnPage));
tableView.getTableHeader().paint(g2);//paint header at top g2.translate(0f,headerHeightOnPage);//跳过头
g2.translate(0f,-pagerow*pageHeightForTable);//设置打印页所在TABLE中的垂直偏移量
if (pagerow + 1 == pagerowForTable) {
double lastRowPrinted = numRowsOnAPage * pagerow;
double numRowsLeft = tableView.getRowCount() - lastRowPrinted;
g2.setClip(clnpages[pagecolumn][0], (int)(pageHeightForTable * pagerow),
clnpages[pagecolumn][1],
(int) Math.ceil(oneRowHeight * numRowsLeft+rowMargin));
}
//else clip to the entire area available.
else{
g2.setClip(clnpages[pagecolumn][0], (int)(pageHeightForTable*pagerow),
clnpages[pagecolumn][1],
(int) Math.ceil(pageHeightForTable+rowMargin));
} tableView.paint(g2); return Printable.PAGE_EXISTS;
}
private int[][] getPageColumnWidthPos(int pagewidth){
TableColumnModel cm=this.getColumnModel();
int cnt=cm.getColumnCount();
java.util.Vector vt=new java.util.Vector();
int w=0,x=0,currentpagewidth=0;
int[] nextpagepos;
for(int i=0;i<cnt;i++){
w=cm.getColumn(i).getWidth();
if (currentpagewidth+w>pagewidth){
if (currentpagewidth>0){
nextpagepos=new int[2];
nextpagepos[0]=x;
x+=currentpagewidth;
nextpagepos[1]=currentpagewidth;
vt.add(nextpagepos);
}
while(w>=pagewidth){
nextpagepos=new int[2];
nextpagepos[0]=x;
x+=pagewidth;
nextpagepos[1]=pagewidth;
vt.add(nextpagepos);
w-=pagewidth;
}
currentpagewidth=w; }else{
currentpagewidth+=w;
}
}
if (currentpagewidth>0){
nextpagepos=new int[2];
nextpagepos[0]=x;
x+=currentpagewidth;
nextpagepos[1]=x;
vt.add(nextpagepos);
}
int[][] ret=new int[vt.size()][];
vt.toArray(ret);
return ret;
}
private int printPageCount(Graphics graphics){
PageFormat pageFormat=PrinterJob.getPrinterJob().defaultPage();
Graphics2D g2 = (Graphics2D) graphics;
JTable tableView=this;
g2.setColor(Color.black);
int fontHeight=g2.getFontMetrics().getHeight();
int fontDesent=g2.getFontMetrics().getDescent(); int pageHeight = (int)pageFormat.getImageableHeight()-fontHeight;
int pageWidth = (int)pageFormat.getImageableWidth();
int tableWidth = tableView.getColumnModel().getTotalColumnWidth(); int [][] clnpages=this.getPageColumnWidthPos((int)pageWidth);
int pagecolumnForTable=clnpages.length;
int rowMargin=tableView.getRowMargin();
int headerHeightOnPage=(tableView.getTableHeader().getHeight());
int oneRowHeight=tableView.getRowHeight();
int numRowsOnAPage=(pageHeight-headerHeightOnPage)/oneRowHeight;
int pageHeightForTable=oneRowHeight*numRowsOnAPage; int pagerowForTable=(tableView.getRowCount()+numRowsOnAPage-1)/numRowsOnAPage; int totalNumPages= pagerowForTable*pagecolumnForTable;
return totalNumPages;
}
public void print(){
java.awt.print.PrinterJob job=java.awt.print.PrinterJob.getPrinterJob();
job.setPrintable(this);
if (job.printDialog()){
try{
job.print();
}catch (Exception exc){
}
}
}
public void printPreview(){
PrintPreviewDialog ppd=new PrintPreviewDialog(null,"打印预览",true,this);
ppd.show();
}}
如果有一天我成为了这样的高手,我将一定仿效tanghuan的英雄般的举动。
建议斑竹放在FAQ中,可以给更多人带来方便,大家看如何
打印和预览一直是JAVA的痛,虽然这个是很小的一点,但可以给其他人以帮助和启发,用在其他地方,或者改的更好,
建议斑竹放在FAQ中,可以给更多人带来方便,大家看如何
支持!
[email protected]
有time发份资料过来 谢谢你csdn需要你及我不知道的作者们 没有你们哪会有csdn的好日子过呀!
能不能得到源代码??邮箱:
[email protected]