Preencher A4 com variáveis, imagem de fundo e campos específicos

12 respostas
M

Salve galera,

Gostaria de uma ajuda em um aplicativozinho para preencher minutas automaticamente em que estou trabalhando.

Ele tem um banco de dado onde coloco as filiais destino. Eu coloco em uma tela inicial valor de volumes, peso, tipo de serviço e quando executo ele preenche a minuta correspondente a companhia usada, trazendo as informação de destino e remetente e setando os campos corretos com os valores passados por parâmetro. Eu já criei o aplicativo e ficou bom, não vou postar aqui pois fiz em netbeans e deu mais de 300 linhas, não preciso dizer que fico bem sujo o código.

Minha duvida seria o seguinte, não consigo passar isso para o papel. Tentei fazer algumas gambiarras usando PrintJob em um Jpanel. Mas ou sai grande de mais no A4 ou simplesmente fica terrível na tela do aplicativo. Não consegui configurar para sair 2 minutas espelhos no A4. Foi ai que parti para o irepot e jasper. No entanto não consigo tutorias ou dicas para usá-lo preenchendo campos específicos, usando um backgroud com as minutas relacionadas a companhia corresponde e usando variáveis dinâmicas.

Normalmente só vi usando com listas e resultset.

Alguém poderia me ajudar.

Sou iniciante e essa duvida não tem fins lucrativos…rsrsrsrsrs grato pela ajuda!

12 Respostas

M

Alguém saberia me ajudar, se pelo menos estaria no caminho certo com Ireport/Jasper? Acho que seria semelhante a um boleto onde você tem informações passadas no momento junto com resultados puchados de um BD.

H

tanto o printjob como o ireport dá para fazer o que vc deseja, tenho aplicações com complementos similares que dá certo, agora tem que ver o que é mais comodo para você…

M

acredito que o printjob seria mais tranquilo nesse primeiro momento, pois ireport não sei nada ainda. Mas como seria uma configuração comoda para imprimir duas minutas espelhos como por exemplo a da TAM ou GOL em um A4? pq colocando o Jpanel com medida de um A4 ele mau cabe na tela do PC e quando imprime sai muito grande, muito estranho para configurar.

H

e porque precisa necessariamente ser um JPANEL? vc nao pode refazer isso na montagem de impressao?

se não pode, de uma olhada de como tirar um print screen de um jpanel, depois disso mande essa imagem para impressao…

M
Eu não acho que tenha que ser necessariamente num Jpanel, mas é assim que eu consegui quase fazer!
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        // todo conteúdo do Jpanel é impresso
        Toolkit tkp = jP_Minuta.getToolkit();
        PrintJob pjp = tkp.getPrintJob(this, null, null);
        Graphics g = pjp.getGraphics();
        jP_Minuta.print(g);
        g.dispose();
        pjp.end();
    }
Quando aciono o evento tudo que esta dentro do Jpanel é enviado para a impressora, o problema é configurar as proporções que acho que não estou sabendo fazer. A minuta eu coloco como um Icon em um Jlabel, e depois insiro alguns JLabel por cima para preencher os campos que quero. Abaixo esta o comando que uso na tela inicial que chama a minuta ja passando alguns campos por paramentro.
private void jB_CalcularActionPerformed(java.awt.event.ActionEvent evt) {                                            
        // Chama minuta e passa peso e volume
      if(10>=Integer.parseInt(jT_Peso.getText())) {
          FormGol.tempA = String.valueOf(jCBX_Destino.getSelectedItem());
          new FormGol().setVisible(true);
          FormGol.jL_Peso.setText(jT_Peso.getText());
          FormGol.jL_Volumes.setText(jT_Qtd_Volumes.getText());
      }else{
          new FormTeste().setVisible(true);
          
        FormTeste.getjT_Teste().setText(String.valueOf(jT_Peso.getText()));

        FormTeste.getjT_Teste().setText(jT_Peso.getText());
      }
Caso por exemplo a minuta GOL seja chamada, ela recebe o resultado temporário de uma variável que representa o destino selecionado. E pucha do BD preenchendo os campos do Jlabel em cima do Jlabel de fundo com o desenho da minuta. Foi assim que quase consegui fazer.
H

Quais as informações que precisa ser impressa? é possível você mostrar?
Olhando seu código eu vejo o seguinte:

tempA
jL_Peso
jL_Volumes

vejo que ele faz uma consulta no BD, quais informações?

só isso, o que mais?

tem como mostrar em exemplo de como você gostaria que ficasse? tipo no paint, no word… só pra ver como você quer que fique?

M
Eu preciso preencher uma minuta exatamente como essa aqui, fazendo pra GOL vai ser igual a outras companhia: [url]https://pt.scribd.com/doc/218814083/Minuta-Gollog[/url] espelhada, igual esta ai, mas não preciso preencher todos os campos e outros são staticos. quanto a consulta fica assim:
public FormGol() {
       //System.out.print("valor de temp é " +tempA);
       
       initComponents();
       //jL_Peso.setText("Teste");
       FormGol = new conexao();
            FormGol.conecta();
            FormGol.executeSQL("select * from CAD_DESTINO where Des_Sigla = '"+tempA+"'");
            try
            {
                FormGol.resultset.first();
                mostra_dados();
            }
            catch (SQLException erro)
            {
                JOptionPane.showMessageDialog(null, "Não localizou dados");
            }
       
       
    }
public void mostra_dados()
    {
        try
         {
           jL_Nome.setText(FormGol.resultset.getString("DES_nome"));
           jL_Cidade.setText(FormGol.resultset.getString("DES_cidade"));
           jL_Logradouro.setText(FormGol.resultset.getString("DES_logradouro"));
           jL_CNPJ.setText(FormGol.resultset.getString("DES_cnpj"));
           jL_Estado.setText(FormGol.resultset.getString("DES_estado"));
           
           
            //System.out.println(con_cidade.resultset.getString("nome"));
        
         }
         catch (SQLException erro)
         {
            JOptionPane.showMessageDialog(null, "Não localizou dados");
         }
    }

}
H

entendi, isso é algo possível e não muito difícil, até agora o que você consegue fazer?


Edit:

Aqui um exemplo, peguei na internet esse código pronto, e fiz algumas alterações acrescentando umas linhas, de uma olhada, agora é só você fazer as alterações de acordo com seu interesse que já vai funcionar…

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Rodrigo-PC
 */
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterJob;

public class JavaWorldPrintExample1 implements Printable {

    public static void main(String[] args) {

        JavaWorldPrintExample1 example1 = new JavaWorldPrintExample1();
        System.exit(0);
    }

    //--- Private instances declarations
    private final double INCH = 72;

    /**
     * Constructor: Example1
     * <p>
     *
     */
    public JavaWorldPrintExample1() {

        //--- Create a printerJob object
        PrinterJob printJob = PrinterJob.getPrinterJob();

    //--- Set the printable class to this one since we
        //--- are implementing the Printable interface
        printJob.setPrintable(this);

    //--- Show a print dialog to the user. If the user
        //--- click the print button, then print otherwise
        //--- cancel the print job
        if (printJob.printDialog()) {
            try {
                printJob.print();
            } catch (Exception PrintException) {
                PrintException.printStackTrace();
            }
        }

    }

    /**
     * Method: print
     * <p>
     *
     * This class is responsible for rendering a page using the provided
     * parameters. The result will be a grid where each cell will be half an
     * inch by half an inch.
     *
     * @param g a value of type Graphics
     * @param pageFormat a value of type PageFormat
     * @param page a value of type int
     * @return a value of type int
     */
    @Override
    public int print(Graphics g, PageFormat pageFormat, int page) {

        Graphics2D g2d;

        //--- Validate the page number, we only print the first page
        if (page == 0) {  //--- Create a graphic2D object a set the default parameters
            g2d = (Graphics2D) g;
            g2d.setColor(Color.black);
            int horizontal = 30;
            for (int j = 0; j < 10; j++) {
                g2d.drawString("Linha " + j, 30, horizontal += 20);
            }

            return (PAGE_EXISTS);
        } else {
            return (NO_SUCH_PAGE);
        }
    }

} //Example1
M

Só não tenho certeza de como que vou usar este código, testei e ele abre direto a impressão, não consigo visualizar direito o que estou imprimindo. Acho que tenho que usar menos o NETBEANS!
Vou quebra a cabeça um pouco aqui mas se você tiver uma dica de em que campo coloco a minuta de fundo e, ou onde coloco os campo que quero preencher, agradeço!

H

Observe que tem uma função se nao me enganho drawImage, vc posiciona a imagem na forma que vc tem o interesse, e pronto… ai depois é soh colocar o texto, sacou?

edit…
deixa eu acrescentar sua dúvida

for (int j = 0; j < 10; j++) { g2d.drawString("Linha " + j, 30, horizontal += 20); }
isso aqui imprime as informações que você ta vendo, basta ver como isso funciona que você coloca o texto…
a drawImage colocará a imagem de fundo que você precisa…

Abraços

M

Isso mesmo amigo, não foi fácil aprender a usar esse código, mas no final parece que esta dando certo! Obrigado pela ajuda.

H

que bom que esta dando certo, se travar em algo, mande noticias, caso termine tudo certo mete um resolvido rss

Abraços

Criado 6 de março de 2015
Ultima resposta 11 de mar. de 2015
Respostas 12
Participantes 2