VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 792|回复: 2

如何实现打印表单?

[复制链接]

3

主题

4

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-2-23 11:00:01 | 显示全部楼层 |阅读模式
把数据库中的数据按照一定的表格格式打印出来。
怎么设定格式,如何取数据添加到表格中等,
希望有经验的大虾指点下,谢了!
回复

使用道具 举报

1

主题

51

帖子

32.00

积分

新手上路

Rank: 1

积分
32.00
发表于 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();

   }
}

回复

使用道具 举报

0

主题

1

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-9-2 10:00:02 | 显示全部楼层
好东西
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表