能不能介绍一下怎么搞定的?
还有就是你的方法能不能移植到jsp中来?

解决方案 »

  1.   

    jsp 当然不行呀,JSP到浏览器是已经是HTML文本了,他怎么还会与JAVA有关呢当然,如果是APPLET的话,当然可以呀
      

  2.   

    是我没说清楚
    我想问一下jsp下的分页打印和分页预览可不可以借用一下你的思路
    ^_^
      

  3.   

    恭喜,能不能给我一份源代码!我也正在做打印程序。
    多谢!!!
    my eMail: [email protected]
      

  4.   

    源码能不能发给我,谢谢。
    [email protected]
      

  5.   

    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();
          }
        }
      }
    }
      

  6.   

    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();
      }
      

  7.   

    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();
      }}
      

  8.   

    对 tanghuan的这种做法我表示巨支持和感谢。
    如果有一天我成为了这样的高手,我将一定仿效tanghuan的英雄般的举动。
      

  9.   

    打印和预览一直是JAVA的痛,虽然这个是很小的一点,但可以给其他人以帮助和启发,用在其他地方,或者改的更好,
    建议斑竹放在FAQ中,可以给更多人带来方便,大家看如何
      

  10.   

    回复人: tanghuan() ( ) 信誉:99  2003-09-27 12:06:00  得分:0 
     
     
      打印和预览一直是JAVA的痛,虽然这个是很小的一点,但可以给其他人以帮助和启发,用在其他地方,或者改的更好,
    建议斑竹放在FAQ中,可以给更多人带来方便,大家看如何
      
     
    支持!
      

  11.   

    支持!
     [email protected]
    有time发份资料过来 谢谢你csdn需要你及我不知道的作者们 没有你们哪会有csdn的好日子过呀!
      

  12.   

    先恭喜啊!!!
    能不能得到源代码??邮箱:
    [email protected]