无法生成JTable的图像及其数据

时间:2018-08-15 02:01:32

标签: java swing jtable paint

我在使用paint()时遇到问题。我真正想要的是生成这样的图像(这是屏幕截图):

https://i.stack.imgur.com/SGXlg.png

我使用上面的代码得到的是这样:

https://i.stack.imgur.com/Vozpc.jpg

制作图像的代码是这样的:

// 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");
    }
}

1 个答案:

答案 0 :(得分:1)

首先,一些Java编程基础知识:

  1. 变量名称不应以大写字母开头
  2. 方法名称不应以大写字母开头。

论坛根据上述约定使用关键字突出显示,并且您的变量和方法被错误地突出显示为类名,从而使代码难以阅读。

一些Swing准则:

  1. 所有对Swing组件的更新都应在事件调度线程上完成。这将包括LAF的变更。您可以做的另一项测试是仅使用默认的LAF来查看是否存在任何差异。

  2. 您正在尝试创建可见的GUI映像。在创建映像之前,所有组件的状态可能尚未完成。一种解决方案是将对GenerarImagenFactura()的调用包装到另一个SwingUtilities.invokeLater(...)中,以确保它在EDT的末尾执行。

您还可以尝试使用Screen Image类,该类提供用于创建组件图像的方法。