| 
 | 
 
 
发表于 2020-5-20 15:30:01
|
显示全部楼层
 
 
 
import javax.swing.*; 
import javax.swing.table.*; 
import java.awt.print.*; 
import java.util.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.awt.geom.*; 
import java.awt.Dimension; 
 
public class Report implements Printable{ 
  JFrame frame; 
  JTable tableView; 
 
  public Report() { 
    frame = new JFrame("Sales Report"); 
    frame.addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
      System.exit(0);}}); 
 
    final String[] headers = {"Description", "open price", 
        "latest price", "End Date", "Quantity"}; 
    final Object[][] data = { 
        {"Box of Biros", "1.00", "4.99", new Date(), 
          new Integer(2)}, 
        {"Blue Biro", "0.10", "0.14", new Date(), 
          new Integer(1)}, 
        {"legal pad", "1.00", "2.49", new Date(), 
          new Integer(1)}, 
        {"tape", "1.00", "1.49", new Date(), 
          new Integer(1)}, 
        {"stapler", "4.00", "4.49", new Date(), 
          new Integer(1)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
          new Integer(5)}, 
          {"legal pad", "1.00", "2.29", new Date(), 
          new Integer(5)}, 
          {"legal pad", "1.00", "2.29", new Date(), 
          new Integer(5)}, 
          {"legal pad", "1.00", "2.29", new Date(), 
          new Integer(5)}, 
          {"legal pad", "1.00", "2.29", new Date(), 
          new Integer(5)}, 
          {"legal pad", "1.00", "2.29", new Date(), 
          new Integer(5)}, 
          {"stapler", "4.00", "4.49", new Date(), 
        new Integer(1)}, 
      {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"stapler", "4.00", "4.49", new Date(), 
        new Integer(1)}, 
      {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)}, 
        {"legal pad", "1.00", "2.29", new Date(), 
        new Integer(5)} 
      }; 
 
    TableModel dataModel = new AbstractTableModel() { 
        public int getColumnCount() { 
          return headers.length; } 
        public int getRowCount() { return data.length;} 
        public Object getValueAt(int row, int col) { 
                return data[row][col];} 
        public String getColumnName(int column) { 
                return headers[column];} 
        public Class getColumnClass(int col) { 
                return getValueAt(0,col).getClass();} 
        public boolean isCellEditable(int row, int col) { 
                return (col==1);} 
        public void setValueAt(Object aValue, int row, 
                      int column) { 
                data[row][column] = aValue; 
       } 
     }; 
 
     tableView = new JTable(dataModel); 
     JScrollPane scrollpane = new JScrollPane(tableView); 
 
     scrollpane.setPreferredSize(new Dimension(500, 80)); 
     frame.getContentPane().setLayout( 
               new BorderLayout()); 
     frame.getContentPane().add( 
               BorderLayout.CENTER,scrollpane); 
     frame.setSize(400,200); 
     JButton printButton= new JButton(); 
 
     printButton.setText("Print !"); 
 
     frame.getContentPane().add( 
               BorderLayout.SOUTH,printButton); 
 
 
     printButton.addActionListener( new ActionListener(){ 
        public void actionPerformed(ActionEvent evt) { 
          PrinterJob pj=PrinterJob.getPrinterJob(); 
          pj.setPrintable(Report.this); 
       //使用本地对话框 
          pj.printDialog(); 
          try{ 
            pj.print(); 
          }catch (Exception PrintException) {} 
          } 
        }); 
 
        frame.setVisible(true); 
     } 
 
     public int print(Graphics g, PageFormat pageFormat, 
        int pageIndex) throws PrinterException { 
        Graphics2D  g2 = (Graphics2D) g; 
        g2.setColor(Color.black); 
        //对字体进行设置 
        int fontHeight=g2.getFontMetrics().getHeight(); 
        int fontDesent=g2.getFontMetrics().getDescent(); 
 
        //leave room for page number 
        double pageHeight = 
          pageFormat.getImageableHeight()-fontHeight; 
        double pageWidth = 
          pageFormat.getImageableWidth(); 
        double tableWidth = (double) 
          tableView.getColumnModel( 
          ).getTotalColumnWidth(); 
        double scale = 1; 
        if (tableWidth >= pageWidth) { 
                scale =  pageWidth / tableWidth; 
        } 
 
        double headerHeightOnPage= 
                 tableView.getTableHeader( 
                 ).getHeight()*scale; 
        double tableWidthOnPage=tableWidth*scale; 
 
        double oneRowHeight=(tableView.getRowHeight()+ 
                      tableView.getRowMargin())*scale; 
        int numRowsOnAPage= 
              (int)((pageHeight-headerHeightOnPage)/ 
                                  oneRowHeight); 
        double pageHeightForTable=oneRowHeight* 
                                    numRowsOnAPage; 
        int totalNumPages= 
              (int)Math.ceil(( 
                (double)tableView.getRowCount())/ 
                                    numRowsOnAPage); 
        if(pageIndex>=totalNumPages) { 
                      return NO_SUCH_PAGE; 
        } 
 
        g2.translate(pageFormat.getImageableX()+10, 
                       pageFormat.getImageableY()-10); 
       //记录打印张数 
        g2.drawString("Page: "+(pageIndex+1)+" Copyright Asat", 
            (int)pageWidth/2-35, (int)(pageHeight 
            +fontHeight-fontDesent)); 
        g2.translate(0f,headerHeightOnPage); 
        g2.translate(0f,-pageIndex*pageHeightForTable); 
 
        //如果JTABLE比纸张大,对JTABLE进行缩小打印 
        if (pageIndex + 1 == totalNumPages) { 
           int lastRowPrinted = 
                 numRowsOnAPage * pageIndex; 
           int numRowsLeft = 
                 tableView.getRowCount() 
                 - lastRowPrinted; 
           g2.setClip(0, 
             (int)(pageHeightForTable * pageIndex), 
             (int) Math.ceil(tableWidthOnPage), 
             (int) Math.ceil(oneRowHeight * 
                               numRowsLeft)); 
        } 
        //else clip to the entire area available. 
        else{ 
             g2.setClip(0, 
             (int)(pageHeightForTable*pageIndex), 
             (int) Math.ceil(tableWidthOnPage), 
             (int) Math.ceil(pageHeightForTable)); 
        } 
 
        g2.scale(scale,scale); 
        //缩放操作 
        tableView.paint(g2); 
         //打印JTABLE的体 
        g2.scale(1/scale,1/scale); 
        g2.translate(0f,pageIndex*pageHeightForTable); 
        g2.translate(0f, -headerHeightOnPage); 
        g2.setClip(0, 0, 
          (int) Math.ceil(tableWidthOnPage), 
          (int)Math.ceil(headerHeightOnPage)); 
        g2.scale(scale,scale); 
        tableView.getTableHeader().paint(g2); 
        //打印JTABLE的头 
 
        return Printable.PAGE_EXISTS; 
        //PrinterJob以Printable.PAGE_EXISTS来判断是否还需打印 
   } 
 
   public static void main(String[] args) { 
       new Report(); 
 
   } 
} 
 
 |   
 
 
 
 |