我在使用paint()
时遇到问题。我真正想要的是生成这样的图像(这是屏幕截图):
我使用上面的代码得到的是这样:
制作图像的代码是这样的:
// EXTRA: generar una imagen con la factura:
public void GenerarImagenFactura(){
File fichero = new File(FacturaCajeroGen.getFactura_ID() + ".jpg");
String formato = "jpg";
// Creamos la imagen para dibujar en ella.
BufferedImage imagen = new BufferedImage(this.getContentPane().getWidth(),
this.getContentPane().getHeight(), BufferedImage.TYPE_INT_RGB);
// Hacemos el dibujo
Graphics g = imagen.getGraphics();
this.getContentPane().paint(g);
// Escribimos la imagen en el archivo.
try {
ImageIO.write(imagen, formato, fichero);
} catch (IOException e) {
System.out.println("Error de escritura");
}
}
其余的代码是这样的(JTable的变量名是tbcarrito
):
public class GUI_Factura extends javax.swing.JFrame {
public static ControlMySQL DatosFacturaGen;
public static ResultSet aux;
Cliente ClienteCajeroGen;
Factura FacturaCajeroGen;
Personal CajeroGen;
public GUI_Factura(ControlMySQL DatosCajero, Cliente ClienteCajero, Factura FacturaCajero, Personal Cajero) {
initComponents();
DatosFacturaGen = DatosCajero;
ClienteCajeroGen = ClienteCajero;
FacturaCajeroGen = FacturaCajero;
CajeroGen = Cajero;
GenerarFactura();
}
public void main(String args[]) {
/* Set the Nimbus look and feel */
//<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
/* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
* For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
*/
try {
for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
javax.swing.UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
java.util.logging.Logger.getLogger(GUI_Factura.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
}
//</editor-fold>
//</editor-fold>
/* Create and display the form */
java.awt.EventQueue.invokeLater(() -> {
new GUI_Factura(DatosFacturaGen, ClienteCajeroGen, FacturaCajeroGen, CajeroGen).setVisible(true);
});
}
public void GenerarFactura(){
// Información de la Empresa:
txtEmpresaNombre.setText("MegaMaxi el Condado");
txtEmpresaCajero.setText(CajeroGen.getNombre() + " " + CajeroGen.getApellido());
// Información de la Factura:
txtFacturaID.setText(FacturaCajeroGen.getFactura_ID());
txtFacturaFecha.setText(GenerarFecha());
// Datos del Cliente:
txtClienteNombre.setText(ClienteCajeroGen.getNombre() + " " + ClienteCajeroGen.getApellido());
txtClienteCI.setText(ClienteCajeroGen.getCI());
txtClienteDireccion.setText(ClienteCajeroGen.getDireccion());
txtClienteTelefono.setText(ClienteCajeroGen.getNumero());
// Generar el Carrito de Compras
GenerarCarrito();
// Generar Valores a Pagar
txtSubtotal.setText(String.valueOf(FacturaCajeroGen.getSubtotal()));
txtIVA.setText(String.valueOf(FacturaCajeroGen.getIVA()));
txtDescuento.setText(String.valueOf(FacturaCajeroGen.getDescuento()));
txtTotal.setText(String.valueOf(FacturaCajeroGen.getTotal()));
// Generar Imagen de la Factura
GenerarImagenFactura();
}
public String GenerarFecha(){
Date date = new Date();
DateFormat hourdateFormat = new SimpleDateFormat("HH:mm:ss dd/MM/yyyy");
return hourdateFormat.format(date);
}
public void GenerarCarrito(){
DefaultTableModel model = (DefaultTableModel) tbCarrito.getModel();
model.setRowCount(0);
try {
aux = DatosFacturaGen.consultarFacturaProductos(FacturaCajeroGen.getFactura_ID());
while (aux.next())
{
model.addRow(new Object[]
{aux.getString(1),aux.getString(2),aux.getString(3),
aux.getString(4),aux.getString(5),aux.getString(6)});
}
} catch (SQLException ex) {
}
}
// EXTRA: generar una imagen con la factura:
public void GenerarImagenFactura(){
File fichero = new File(FacturaCajeroGen.getFactura_ID() + ".jpg");
String formato = "jpg";
// Creamos la imagen para dibujar en ella.
BufferedImage imagen = new BufferedImage(this.getContentPane().getWidth(),
this.getContentPane().getHeight(), BufferedImage.TYPE_INT_RGB);
// Hacemos el dibujo
Graphics g = imagen.getGraphics();
this.getContentPane().paint(g);
// Escribimos la imagen en el archivo.
try {
ImageIO.write(imagen, formato, fichero);
} catch (IOException e) {
System.out.println("Error de escritura");
}
}
答案 0 :(得分:1)
首先,一些Java编程基础知识:
论坛根据上述约定使用关键字突出显示,并且您的变量和方法被错误地突出显示为类名,从而使代码难以阅读。
一些Swing准则:
所有对Swing组件的更新都应在事件调度线程上完成。这将包括LAF的变更。您可以做的另一项测试是仅使用默认的LAF来查看是否存在任何差异。
您正在尝试创建可见的GUI映像。在创建映像之前,所有组件的状态可能尚未完成。一种解决方案是将对GenerarImagenFactura()
的调用包装到另一个SwingUtilities.invokeLater(...)
中,以确保它在EDT的末尾执行。
您还可以尝试使用Screen Image类,该类提供用于创建组件图像的方法。