0

如何在 Java Standalone 应用程序中使用 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();
    }

}
}
4

1 回答 1

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();
}
于 2013-05-13T06:39:41.267 回答