gpt4 book ai didi

java - 在桌面应用程序中使用 JTable 打印 JLabel

转载 作者:行者123 更新时间:2023-12-01 14:35:38 27 4
gpt4 key购买 nike

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

}
}

最佳答案

首先从您设计的基础面板或内部框架创建 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();
}

关于java - 在桌面应用程序中使用 JTable 打印 JLabel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16515375/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com