2011-11-19 117 views
0

该应用程序用于从数据库中填写表单或从该表单写入数据库。现在我可以使用netbeans来做这两件事,并联系我现在已经运行的MySQL测试服务器。将JFrame信息发送给打印机

我遇到的问题是我需要以类似于表格的方式打印从数据库获取的信息,以便匹配我们目前在办公室使用的手写表单。有没有办法打印整个JFrame或JFrame中的所有内容,就像它们放在屏幕上供用户查看一样?

到目前为止,我所看到的所有东西都会打印屏幕的某个区域(文本框)或通过表格打印出来。

当所有事情都说完之后,将为Linux和Windows编译应用程序。

代码:

package Information; 

import java.awt.print.*; 
import java.awt.*; 
import javax.swing.*; 

public class HATDB extends javax.swing.JFrame implements Printable { 

    JFrame frameToPrint; 

    /** Creates new form HATDB */ 
    public HATDB() { 
    } 

    @Override 
    public int print(Graphics g, PageFormat pf, int page) throws 
     PrinterException { 

     if (page > 0) { /* We have only one page, and 'page' is zero-based */ 
      return NO_SUCH_PAGE; 
     } 

     /* User (0,0) is typically outside the imageable area, so we must 
     * translate by the X and Y values in the PageFormat to avoid clipping 
     */ 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.translate(pf.getImageableX(), pf.getImageableY()); 

     /* Now print the window and its visible contents */ 
     frameToPrint.printAll(g); 

     /* tell the caller that this page is part of the printed document */ 
     return PAGE_EXISTS; 
    } 

    public HATDB(JFrame f) { 
     frameToPrint = f; 
    } 

    private void OK_ButtonActionPerformed(java.awt.event.ActionEvent evt) { 
     PrinterJob job = PrinterJob.getPrinterJob(); 
     //job.setPrintable(); 
     boolean ok = job.printDialog(); 
     if (ok) { 
      try { 
       job.print(); 
      } catch (PrinterException ex) { 
       ex.printStackTrace(System.err); 
      } 
     } 

    } 

    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 

     JFrame f = new JFrame("Print UI Example"); 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new HATDB().setVisible(true); 
      } 
     }); 
    } 
} 
+0

是的,您可以打印类似于打印其他Java组件的JFrame,但它并未针对创建漂亮的打印输出进行优化。为什么不使用JasperReports这样的报告工具来创建这种类型的程序来解决这类问题? –

+0

是否有任何示例或方向可以让我使用JasperReports? – Friendlyghost89

+0

呃......我想Google一定是失望了? –

回答

3

JTable API:“J2SE 5增加了方法JTable提供了一些常见的打印需求提供方便的访问简单的新print()方法允许快速和方便地添加打印支持你应用。”这些方法打印您的TableModel中的所有行,而不仅仅是那些可见的行。

附录:您可以打印什么屏幕上的内容,如图Printing the Contents of a User Interface,或者你可以打印TableModel的全部内容,如图hereChapter 6 Continued: Advanced Printing

附录:这是一个例子,打印JPanelJTree

import java.awt.*; 
import java.awt.event.*; 
import java.awt.print.*; 
import javax.swing.*; 

/** @see http://stackoverflow.com/questions/8192204 */ 
public class PrintTest extends JPanel implements Printable { 

    public PrintTest() { 
     this.setLayout(new GridLayout()); 
     JTree tree = new JTree(); 
     this.add(new JScrollPane(tree)); 
     for (int i = 0; i < tree.getRowCount(); i++) { 
      tree.expandRow(i); 
     } 
    } 

    @Override 
    public int print(Graphics g, PageFormat pf, int i) throws PrinterException { 
     if (i > 0) { 
      return NO_SUCH_PAGE; 
     } 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.translate(pf.getImageableX(), pf.getImageableY()); 
     PrintTest.this.printAll(g); 
     return Printable.PAGE_EXISTS; 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       JFrame f = new JFrame(); 
       f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       final PrintTest pt = new PrintTest(); 
       f.add(pt, BorderLayout.CENTER); 
       JButton b = new JButton(new AbstractAction("Print") { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         PrinterJob pj = PrinterJob.getPrinterJob(); 
         PageFormat pf = pj.pageDialog(pj.defaultPage()); 
         pj.setPrintable(pt, pf); 
         if (pj.printDialog()) { 
          try { 
           pj.print(); 
          } catch (PrinterException pe) { 
           pe.printStackTrace(System.err); 
          } 
         } 
        } 
       }); 
       JPanel p = new JPanel(); 
       p.add(b); 
       f.add(p, BorderLayout.SOUTH); 
       f.pack(); 
       f.setVisible(true); 
      } 
     }); 
    } 
} 
+0

我可以做简单的打印(打印文本框或表格的内容,但不是整个表格)。我遇到的问题是我试图打印屏幕上显示的窗体。这不起作用。 – Friendlyghost89

+0

我已经为以上两种方法添加了链接。 – trashgod

+0

我已经添加了上面解释的代码,但我不知道它是否正确(我是一个新的Java ...)我不知道如何发布文件在这里,所以我上传一个简单的模拟该程序。 – Friendlyghost89