2013-05-13 48 views
0

如何在Java獨立應用程序中使用JTable打印JLabel?在桌面應用程序中打印帶JTable的JLabel

我已經創建了GUI,在其中添加了一些標籤和一個jable。我想打印這個GUI。我也使用了表格API,但它只打印表格。但是,如果我打印所有的組件,那麼表中的所有內容都不可見。

我使用NetBeans IDE 7.2

這裏是代碼,我已經使用:

import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.print.PageFormat; 
import java.awt.print.Printable; 
import java.awt.print.PrinterException; 
import java.text.MessageFormat; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import javax.swing.JOptionPane; 
import javax.swing.JTable; 

public class Frm1 extends javax.swing.JInternalFrame implements Printable,ActionListener{ 

/** 
* Creates new form Frm1 
*/ 
public Frm1() { 
    initComponents(); 
jButton1.addActionListener(this); 


} 

/** 
* This method is called from within the constructor to initialize the form. 
* WARNING: Do NOT modify this code. The content of this method is always 
* regenerated by the Form Editor. 
*/ 
@SuppressWarnings("unchecked") 
// <editor-fold defaultstate="collapsed" desc="Generated Code"> 
private void initComponents() { 

    jScrollPane1 = new javax.swing.JScrollPane(); 
    jTable1 = new javax.swing.JTable(); 
    jButton1 = new javax.swing.JButton(); 
    jLabel1 = new javax.swing.JLabel(); 
    jLabel2 = new javax.swing.JLabel(); 

    jTable1.setModel(new javax.swing.table.DefaultTableModel(
     new Object [][] { 
      {null, null, null, null}, 
      {null, null, null, null}, 
      {null, null, null, null}, 
      {null, null, null, null} 
     }, 
     new String [] { 
      "Title 1", "Title 2", "Title 3", "Title 4" 
     } 
    )); 
    jScrollPane1.setViewportView(jTable1); 

    jButton1.setText("Print"); 
    jButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

    jLabel1.setText("To"); 

    jLabel2.setText("ABC"); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(20, 20, 20) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 367,  javax.swing.GroupLayout.PREFERRED_SIZE) 
       .addComponent(jButton1) 
       .addGroup(layout.createSequentialGroup() 
        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 49, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
        .addComponent(jLabel2))) 
      .addContainerGap(18, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addContainerGap(21, Short.MAX_VALUE) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(jLabel1) 
       .addComponent(jLabel2)) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
      .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 188, javax.swing.GroupLayout.PREFERRED_SIZE) 
      .addGap(18, 18, 18) 
      .addComponent(jButton1) 
      .addContainerGap()) 
    ); 

    pack(); 
}// </editor-fold> 

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 

{           
MessageFormat format=new MessageFormat("ABC "); 
    try { 
     jTable1.print(JTable.PrintMode.NORMAL, format, format, iconable, null, isSelected, null); 
    // TODO add your handling code here: 
}           
catch(Exception e){ 
JOptionPane.showMessageDialog(rootPane, "Error"); 
e.printStackTrace(); 
} 
} 
// Variables declaration - do not modify 
private javax.swing.JButton jButton1; 
private javax.swing.JLabel jLabel1; 
private javax.swing.JLabel jLabel2; 
private javax.swing.JScrollPane jScrollPane1; 
private javax.swing.JTable jTable1; 
// End of variables declaration 

@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 */ 

    this.printAll(g); 

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

@Override 
public void actionPerformed(ActionEvent e) { 
    try { 
     jTable1.print(JTable.PrintMode.FIT_WIDTH); 


    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

} 
} 
+0

http://stackoverflow.com/questions/13311017/java-gui-printing-blank-page/13311280#13311280。檢查答案中的打印方法 – Raghunandan 2013-05-13 05:39:46

+0

打印JLabel,然後打印JTable, – 2013-05-13 06:05:12

回答

1

首先從設計的底座面板或內部框架創建的BufferedImage ..

private BufferedImage createImage(JPanel panel) {  
     int w = panel.getWidth(); 
     int h = panel.getHeight(); 
     BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); 
     Graphics2D g = bi.createGraphics(); 
     panel.paint(g); 
     return bi; 
    } 

傳將BufferedImage的對象映射到您的打印API的GraphicsObject。

@Override 
public int print(Graphics g, PageFormat pf, int page) throws PrinterException { 
Graphics2D g2d = (Graphics2D)g; 
g2d.drawImage(createImage(this), 0, 0, null); 
g2d.dispose(); 
} 
+0

不能打印完整的jTable並丟失Jlabels,第一列jtable在打印輸出中不可見。 – Manpreet 2013-05-13 07:18:43

+0

它會創建你的面板的圖像,無論它在面板上是否可見都將被打印。如果您的屏幕上顯示的所有內容都設置了頁面插頁,則可能是您的圖片大於您的頁面尺寸(A4)。 – 2013-05-13 09:28:20

+0

您也可以使用overriden方法「drawImage()」在指定區域繪製大圖。 – 2013-05-13 09:31:17