2011-11-19 104 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