可以预览的打印的Java程序

这篇博客介绍了一个使用Java编写的打印预览程序,该程序能够预览并打印表格数据。程序包括四个类:MakeJbook、Mainstart、PrintPreviewCanvas和PrintPreviewDialog。PrintPreviewDialog类用于显示预览对话框,PrintPreviewCanvas类负责绘制预览页面,Mainstart类包含了主程序的启动逻辑,而MakeJbook类用于构建要打印的内容。程序支持缩放、翻页和关闭等操作,适用于表格数据的打印需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 我抄了一个可以预览的打印稍微改了一下!这个程序是打印table的数据的!不知道合适你不!有四个类分别是MakeJbook ,Mainstart,PrintPreviewCanvas,PrintPreviewDialog。
public class PrintPreviewDialog extends JDialog {
  class Scale extends Object {
    private double value;
 
    public Scale(double value)
    {
      this.value = value;
    }
 
    public final String toString()
    {
      return (int) (value * 100) + "%";
    }
 
    public final double getValue()
    {
      return value;
    }
  }
 
  public PrintPreviewDialog(JDialog jd,String title,boolean mt,Book b)
  {
    super(jd,title,mt);
    layoutUI(b);
  }
 
  public void layoutUI(Book book)
  {
    setSize(WIDTH, HEIGHT);
 
    Container contentPane = getContentPane();
    canvas = new PrintPreviewCanvas(book);
    contentPane.add(new JScrollPane(canvas), BorderLayout.CENTER);
 
    JPanel buttonPanel = new JPanel();
 
    JButton nextButton = new JButton("下一页");
    buttonPanel.add(nextButton);
    nextButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event)
      {
        canvas.flipPage(1);
      }
    });
 
    JButton previousButton = new JButton("上一页");
    buttonPanel.add(previousButton);
    previousButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event)
      {
        canvas.flipPage(-1);
      }
    });
 
    JButton closeButton = new JButton("Close");
    buttonPanel.add(closeButton);
    closeButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event)
      {
        dispose();
      }
    });
 
    final JComboBox scaleChoice = new JComboBox();
    scaleChoice.setEditable(false);
    scaleChoice.addItem(new Scale(2));
    scaleChoice.addItem(new Scale(1.5));
    scaleChoice.addItem(new Scale(1.0));
    scaleChoice.addItem(new Scale(0.75));
    scaleChoice.addItem(new Scale(0.5));
    scaleChoice.addItem(new Scale(0.25));
    scaleChoice.setSelectedIndex(2) ;
    scaleChoice.addItemListener(new ItemListener() {
      public void itemStateChanged(ItemEvent e)
      {
        if (e.getStateChange() == ItemEvent.SELECTED) {
          final Scale scale = (Scale) e.getItem();
          canvas.scale(scale.getValue());
        }
      }
    });
    buttonPanel.add(new JLabel("Zoom:"));
    buttonPanel.add(scaleChoice);
 
    contentPane.add(buttonPanel, BorderLayout.NORTH);
    JPanel buttonPane2 = new JPanel();
    contentPane.add(buttonPane2, BorderLayout.SOUTH );
  }
 
  private PrintPreviewCanvas canvas;
 
  private static final int WIDTH = 650;
  private static final int HEIGHT = 800;
}
public class PrintPreviewCanvas extends JPanel {
 public PrintPreviewCanvas(Book b) {
  book = b;
  currentPage = 0;

  final PageFormat page = book.getPageFormat(0);
  setPreferredSize(new Dimension((int) (page.getWidth() * ratio),
    (int) (page.getHeight() * ratio)));

 }

 // 填充Panel
 public void paintComponent(Graphics g) {
  super.paintComponent(g);
  /*
   * 此 Graphics2D 类扩展 Graphics 类,以提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。
   * 它是用于在Java(tm) 平台上呈现二维形状、文本和图像的基础类。
   */
  
  Graphics2D g2 = (Graphics2D) g;

  final Dimension prefSize = getPreferredSize();
  final int viewWidth = getWidth();
  final int viewHeight = getHeight();
  final int pageWidth = prefSize.width;
  final int pageHeight = prefSize.height;

  Rectangle2D page = new Rectangle2D.Double((viewWidth - pageWidth) / 2,
    (viewHeight - pageHeight) / 2, pageWidth, pageHeight);
  g2.setPaint(Color.white);
  g2.fill(page);
  g2.setPaint(Color.black);
  g2.draw(page);

  final Printable printable = book.getPrintable(currentPage);
  final PageFormat pageFormat = book.getPageFormat(currentPage);
  try {
   Graphics2D dc = (Graphics2D) g2.create((int) page.getX(),
     (int) page.getY(), (int) page.getWidth(), (int) page
       .getHeight());
   dc.scale(ratio, ratio);
   printable.print(dc, pageFormat, currentPage);
   dc.dispose();
  } catch (PrinterException exception) {
   g2.draw(new Line2D.Double(page.getMinX(), page.getMinY(), page
     .getMaxX(), page.getMaxY()));
   g2.draw(new Line2D.Double(page.getMaxX(), page.getMinY(), page
     .getMinX(), page.getMaxY()));
  }
 }

 public void flipPage(int by) {
  int newPage = currentPage + by;
  if (0 <= newPage && newPage < book.getNumberOfPages()) {
   currentPage = newPage;
   repaint();
  }
 }

 public void scale(double ratio) {
  this.ratio = Math.max(0.1, ratio);

  final PageFormat page = book.getPageFormat(0);
  setPreferredSize(new Dimension((int) (page.getWidth() * this.ratio),
    (int) (page.getHeight() * this.ratio)));
  revalidate();
  repaint();
 }

 private Book book;

 private int currentPage;

 private double ratio = 1.0;
}
public class Mainstart {
 public static PrinterJob getPrinterJ() {
  return java.awt.print.PrinterJob.getPrinterJob();
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  JFrame frame = new JFrame("JTable的排序测试");

  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  // 表格中显示的数据
  Object rows[][] = { { "王明", "中国", "44" }, { "姚明", "中国", "25" },
    { "赵子龙", "西蜀", "1234" }, { "曹操", "北魏", "2112" },
    { "Bill Gates", "美国", "45" }, { "Mike", "英国", "33" } };
  String columns[] = { "姓名", "国籍", "年龄" };
  TableModel model = new DefaultTableModel(rows, columns);
  JTable table = new JTable(model);
  RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
  table.setRowSorter(sorter);
  JScrollPane pane = new JScrollPane(table);
  frame.add(pane, BorderLayout.CENTER);
  frame.setSize(300, 150);
  frame.setVisible(true);

  JDialog dialog = new JDialog();

  Vector vCol = new Vector();
  Vector vSite = new Vector();
  for (int i = 0; i < 3; i++) {
   for (int j = 0; i < 4; i++) {
    vCol.add(j);
    vSite.add(j);
   }
  }

  for (int j = 0; j < 3; j++) {
   // g.drawString((String) jtable.getValueAt(row,
   // ((Integer) vCol.get(j)).intValue()),
   // ((Integer) vSite.get(j)).intValue(), drawli);
   for (int i = 0; i < 5; i++)
    // g.drawString((String) table.getValueAt(row,
    // (Integer) j),
    // / ((Integer) vSite.get(j)).intValue(), drawli);
    System.out.println((String) table.getValueAt(i, ((Integer) j)
      .intValue()));

  }
  Mainstart a = new Mainstart();
  MakeJbook mjbook = new MakeJbook("操作情况查询结果", table, columns, vCol,
    vSite);
  Book book;
  book = mjbook.makebook();
  PrintPreviewDialog ppd = new PrintPreviewDialog(dialog, "打印预览", true,
    book);
  ppd.setVisible(true);

  PrinterJob job = Mainstart.getPrinterJ();

  job.setPageable(book);
  if (job.printDialog()) {
   try {
    job.print();

   } catch (PrinterException pe) {
    System.err.println("打印失败...");
   }
  }
 }

}
public class MakeJbook {
 JTable jtable;

 Vector vCol;

 Vector vSite;

 String title;

 String[] tablehead;// 列名

 Font head = new Font("宋体", Font.PLAIN, 14);

 Font text = new Font("宋体", Font.PLAIN, 12);

 private final int hjg = 15;// 行间隔

 int hs = 0;// 每页可打印的行数

 int pagecount = 0;

 public MakeJbook(String title, JTable jtable, String[] tablehead,
   Vector vCol, Vector vSite) {
  this.jtable = jtable;
  this.tablehead = tablehead;
  this.vCol = vCol;
  this.vSite = vSite;
  this.title = title;
 }

 public Book makebook() {
  int temp = 0;
  Book book = new Book();
  //PageFormat pf=Mainstart.getPaperF();
  PageFormat pf = PrinterJob.getPrinterJob().defaultPage();
  if (pf.getImageableWidth() == 702 && pf.getOrientation() == 0) {
   hs = 34;
  } else if (pf.getImageableWidth() == 594 && pf.getOrientation() == 1) {
   hs = 42;
  } else if (pf.getImageableWidth() == 752 && pf.getOrientation() == 0) {
   hs = 28;
  } else if (pf.getImageableWidth() == 505 && pf.getOrientation() == 1) {
   hs = 45;
  } else {
   // 如果 page format 不符合以上幾種呢?每頁該印幾行?
   hs = 30;
  }
  pagecount = jtable.getRowCount() / hs;
  temp = jtable.getRowCount() % hs;
  if (temp != 0) {
   pagecount = pagecount + 1;
  }
  for (int i = 0; i < pagecount; i++) {
   book.append(new PaintCover(hs * i), pf);
  }
  return book;
 }

 class PaintCover implements Printable {
  private final int startRow;

  public PaintCover(int startRow) {
   this.startRow = startRow;
  }

  public int print(Graphics g, PageFormat pf, int pageIndex)
    throws PrinterException {
   g.translate((int) pf.getImageableX(), (int) pf.getImageableY());
   g.setColor(Color.black);
   g.setFont(head);
   g.drawString(title, ((int) pf.getImageableWidth() - title
       .length() * 9) / 2, 15);
   g.setFont(text);
   g.drawString("第" + String.valueOf(pageIndex + 1) + "頁", 10, 10);
   g.drawLine(80, 18, (int) pf.getImageableWidth() - 80, 18);
   g.drawLine(80, 20, (int) pf.getImageableWidth() - 80, 20);
   g.drawLine(0, 50, (int) pf.getImageableWidth(), 50);
   g.drawLine(0, 70, (int) pf.getImageableWidth(),70);
   g.drawLine(0, 70, (int) pf.getImageableWidth(),70);
   for (int i = 0; i < 3; i++) {
    //g.drawString(tablehead[((Integer) vCol.elementAt(i)).intValue()],
    //  ((Integer) vSite.get(i)).intValue(), 45); vCol.size();
    g.drawString(tablehead[i],
       i*200, 45);
     //System.out.println(tablehead[((Integer)
     //vCol.get(i)).intValue()]);
    //System.out.println(vCol.elementAt(i));
   }
   int drawli = 50 + hjg;
   int row = startRow;
   for (int i = 0; i < jtable.getColumnCount(); i++) {
    //row++;
    for (int j = 0; j < jtable.getRowCount(); j++) {
     //g.drawString((String) jtable.getValueAt(row,
      // ((Integer) vCol.get(j)).intValue()),
      // ((Integer) vSite.get(j)).intValue(), drawli);
     
     g.drawString((String) jtable.getValueAt(j,
        (Integer) i),
        ((Integer) i).intValue()*200,drawli+j*20);
     g.drawLine(0, 70+j*20, (int) pf.getImageableWidth(),70+j*20);
     //System.out.println((String) jtable.getValueAt(j,
      // ((Integer) i).intValue()));

    }
   // drawli = drawli + hjg;
    ++row;
    if (row >= jtable.getRowCount()) {
     break;
    }
   }

   return Printable.PAGE_EXISTS;
  }
 }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值