Problema com jar [Resolvido]

Boa tarde,

Preparei um jar para trabalhar com arquivos zip. É extramamente básico, porém, eficiente. Fiz testes, com as classes, durante o desenvolvimento e tudo ocorreu perfeitamente.

Uma das classes, exibe o nome dos arquivos sendo processados, durante a compacatação/descompactação. E é usada pelas classes que compactam e descompactam, onde o objeto e contruido, e manipulado atraves de um set que envia o nome do arquivo atual.

Até aqui tudo bem, agora quando importei como biblioteca para uso, a janela que mostra os nomes dos arquivos não é exibida. Porém a compactação ocorre conforme previsto.

Alguma idéia do que pode estar acontecendo?

[]s

Boa noite,

Andei mechendo na codificação da classe responsavel pela exibição.

this.setUndecorated(true);

Quanto mudei para “false” para testar, foi possivel visualizar a imagem abaixo:

[URL=http://www.4shared.com/photo/_4DrcZ5P/erro_exibicao.html][/URL]

O fundo ficou preto, ao meu ver, pois meu desktop está com o fundo preto. Entendi que de certa forma, o JDialog com o JPanel, não está visivel. O que ainda não explica como funciona normalmente, sendo chamado diretamente por uma classe main, e não dentro de uma função.

Alguém tem alguma ideia?

[]s

Boa noite,

Mudei a herança de JDialog para JFrame. E ficou assim:

[URL=http://www.4shared.com/photo/jTmiGXvr/erro_exibicao2.html][/URL]

Já tentei diversas modificações além dessa… Será algum bug?

[]s

O problema só ocorre quando executa o jar? Ou quando executa a classe diretamente também ocorre o problema?

Setou o tamanho da janela?

Esse criei uma classe main.java, no pacote para testar, estava funcionando normalmente. Depois exportei o jar, para uso, e a janela não é exibida. Como teste, copiei todos os .java, do projeto para o outro mesmo assim sem sucesso.

public class Exibicao extends JDialog {
    private JPanel painelPrincipal;
    private JProgressBar barraDeProgresso;

    /**
     * Classe para uso interno.  Essa classe é utilizada pelas classes:
     * - Descompactador
     * - Compactador
     *
     * A presente classe, é responsável, pela exibição dos nomes dos arquivos.
     * Enquanto são manipulados pelas respectivas classes, citadas, acima.
     */
    public Exibicao() {
        this.inicializaPainelPrincipal();
        this.inicializaBarraDeProgresso();
        this.inicializaCaixaDeDialogo();
    }

    private void inicializaBarraDeProgresso() {
        // Controi a barra de progresso.
        this.barraDeProgresso = new JProgressBar();
        // Seta a barra de progresso para funcionar indeterminadamente.
        this.barraDeProgresso.setIndeterminate(true);

        // Constroi a fonte.
        Font fonte = new Font(Font.SANS_SERIF, Font.PLAIN, 24);
        // Seta a fonte na barra de progresso.
        this.barraDeProgresso.setFont(fonte);

        // Habilita a mensagem no centro da barra de progresso.
        this.barraDeProgresso.setStringPainted(true);

        // Cria objeto para dimencionar o tamanho da barra de progresso.
        Dimension dimensao = new Dimension(490, 45);
        // Seta o tamanho para a barra de progresso.
        this.barraDeProgresso.setPreferredSize(dimensao);

        // Acrescenta barra de progresso no painel principal.
        this.painelPrincipal.add(this.barraDeProgresso);
    }

    private void inicializaPainelPrincipal() {
        // Constroi o painel principal.
        this.painelPrincipal = new JPanel();
    }

    private void inicializaCaixaDeDialogo() {
        // Seta a caixa de dialogo para não ser redimencionada.
        this.setResizable(false);
        // Adiciona o painel principal como container da caixa de dialogo.
        this.setContentPane(this.painelPrincipal);
        // Cria objeto para dimencionar o tamanho da barra de progresso.
        Dimension dimensao = new Dimension(500, 55);
        // Seta o tamanho da caixa de dialogo.
        this.setSize(dimensao);
        // Remove as bordas da caixa de dialogo.
        this.setUndecorated(true);
    }

    /**
     * Carrega a informação a ser exibida, durante os processos.
     * @param informeMensagem
     */
    public void setMensagem(String informeMensagem) {
        this.barraDeProgresso.setString(informeMensagem);
    }

}

Esse código acima é o responsável pela janela que mostra o andamento do processo. Essa classe é usada como um, componente “tem um” em uma classe que compacta, no caso o teste feito com o Main.java executo a classe que faz o backup, e ela cria e manipula esse objeto.

[]s

Estranho. Já verificou se no jar estão todas as classes do projeto?

Boa tarde,

Sim as classes que compoem esse pacote, estão todas presentes, tanto na importação quanto na cópia.

[]s

Seu problema me deixou curioso. Acabei de copiar sua classe e criei um main class pra executá-la, empacotei num jar e rodou normal.

Já tentou executar o jar pelo terminal pra ver se aparece alguma exceção?

Boa noite,

Segue código da classe que faz uso desse objeto, com código, informado no post anterior:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Stack;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

/**
 *
 * @author Anderson C. Fios
 * Informações para contato:
 * Telefones: (16) 3366-1356 / (16) 9723-5507
 * E-mail: afconsultoriaeservicos@gmail.com
 * Msn: afconsultoriaeservicos@gmail.com
 */
public class Compactador {
    private Exibicao exibicao;

    /**
     * Contrutor da classe.
     */
    public Compactador() {
        // Constroi objeto para exibição das mensagens.
        this.exibicao = new Exibicao();
        // Seta a posição da janela, para o centro.
        this.exibicao.setLocationRelativeTo(null);
    }

    /**
     *
     * @param arquivoDeEntrada Arquivo a ser comprimodo.
     * @param arquivoZip Arquivo de saida com a extensão .zip. Ex: arquivo.zip
     * @throws IOException
     */
    public void executaProcedimentos(File[] arquivoDeEntrada, File arquivoZip)
            throws IOException {
        // Exibe a tela que mostra os arquivos.
        this.exibicao.setVisible(true);

        // Verifica se os parametros passados são validos.
        if (arquivoDeEntrada != null && arquivoDeEntrada.length > 0) {
            // Prepara arquivo para gravação de informações.
            ZipOutputStream out = new ZipOutputStream(
                    // Cria arquivo de saida.
                    new FileOutputStream(
                    // Utiliza a referencia ao arquivo para gerar a saida.
                    arquivoZip
                    ) // Fecha: FileOutputStream.
                    ); // Fecha: ZipOutputStream.
            // Cria pilha com os caminhos do arquivo.
            Stack<File> parentDirs = new Stack<File>();
            // Executa metodo para compactar arquivos e diretorios.
            compactaArquivos(parentDirs, arquivoDeEntrada, out);
            // Fecha a saida, terminando o procedimento de compressão de dados.
            out.close();
        }

        this.exibicao.dispose();
    }

    // Metodo privado criao para ser reaproveitado recursivamente.
    private void compactaArquivos(
            // Recebe os parametros para execução da compactação.
            // Stack = Pilha - Nesse caso especifico uma pilha de arquivos,
            // File[] = Vetor de arquivos,
            // ZipOuptStream = Arquivo executaProcedimentos.
            Stack<File> parentDirs, File[] files, ZipOutputStream out
            // Faz com que execeção seja implementada ao usar o metodo.
            ) throws IOException {
        // Prepara espaço na memoria, para, servir de buffer.
        byte[] buf = new byte[1024];

        // Executa laço para cada arquivo, que compoem a estrutura,
        // informada ao metodos
        for (int i = 0; i < files.length; i++) {
            // Exibe o nome do arquivo que está sendo processado.
            this.exibicao.setMensagem(files[i].getName());
            // Verifica se o arquivo é um diretorio.
            if (files[i].isDirectory()) {
                // Se a entrada é um diretório, empilha os arquivos que compoem
                // o diretório.

                // Prepara a pilha com os arquivos.
                parentDirs.push(files[i]);
                // Passa os paramentros para o metodo de compactação.
                compactaArquivos(parentDirs, files[i].listFiles(), out);

                // Após processar as entradas do diretório, desempilha.
                parentDirs.pop();
            } else {
                // Caso não seja um diretorio executa outro procedimento de
                // compactação.

                // Carrega arquivo a ser compactado em memoria para ser
                // manipulado.
                FileInputStream in = new FileInputStream(files[i]);

                // Itera sobre os itens da pilha para montar o caminho
                // completo do arquivo.
                String path = "";
                for(File parentDir : parentDirs) {
                    path += parentDir.getName() + "/";
                }

                // Grava os dados no arquivo executaProcedimentos.
                out.putNextEntry(new ZipEntry(path + files[i].getName()));

                // Armazena o tamanho do buffer.
                int len;

                // Abre um laço de repetição, que usa o tamanho do buffer,
                // caso o valor, seja superior a 0 continua o processo de
                // gravação.
                while ((len = in.read(buf)) > 0) {
                    // Grava a saida processada em disco.
                    out.write(buf, 0, len);
                }

                // Finaliza a cessão, para saida.
                out.closeEntry();
                // Finaliza o espaço em memoria usado para manipulação.
                in.close();
            }
        }
    }

Código da classe Main, responsavel, pela execução:

import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Kaos
 */
public class Main {
    public static void main(String args[]) {
        Compactador compactador = new Compactador();
        File entrada = new File("E:/backup/Empresa");
        File saidaZip = new File("E:/backup/backup/arquivo.zip");
        try {
            compactador.executaProcedimentos(entrada.listFiles(), saidaZip);
        } catch (IOException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

Até aqui funciona por completo, compacta e exibe o status. O código abaixo já da o problema, ou seja, compacta mas não mostra a janela.

    private MenuItem getItemBackup() {
        // Constroi objeto que vai ser repassado pelo retorno.
        MenuItem itemBackup = new MenuItem("Copiar");

        // Metodo responsavel pela contrucao do evento.
        ActionListener acao = new ActionListener() {
            // Implementa o metodo personalizado.
            @Override
            public void actionPerformed(ActionEvent e) {
                if(tarefaEmAndamento.getSituacao()) {
                    trayIcon.displayMessage(
                            // Exibe titulo do aviso.
                            "Aguarde...",
                            // Exibe a mensagem.
                            "Sistema ocupado!",
                            // Seleciona o icone.
                            TrayIcon.MessageType.WARNING);
                } else {
                    tarefaEmAndamento.setSituacao();
                    String status = "";
                    int resposta = JOptionPane.showConfirmDialog(
                            null,
                            "Confirma a execução da cópia?",
                            "Confirmação",
                            JOptionPane.OK_CANCEL_OPTION,
                            JOptionPane.INFORMATION_MESSAGE
                            );
                    if(resposta == 0) {
                        try {
                        AfBackUp afbackup = new AfBackUp();
                        if(afbackup.executaCompactacao()) {
                            status = "Cópia executada!";
                        } else {
                            status = "Problema durante cópia!";
                        }
                        trayIcon.displayMessage(
                                // Exibe o  titulo do aviso.
                                "Informação",
                                // Exibe a mensagem.
                                status,
                                // Seleciona o icone.
                                TrayIcon.MessageType.INFO
                            );
                        } finally {
                            tarefaEmAndamento.setSituacao();
                        }
                    } else {
                        tarefaEmAndamento.setSituacao();
                    }
                }
            }
        };

        // Adiciona acao ao item.
        itemBackup.addActionListener(acao);

        return itemBackup;
    }

Sinceramente, não estou vendo onde está o problema…

[]s

No primeiro post você tinha dito que o problema só ocorre quando executa o jar, certo?

Tente executar o jar pela linha de comando:

java -jar nomeDoJar.jarPois assim, se alguma exceção for lançada, será impresso o stack trace.

Boa tarde,

Só para garantir fiz na linha de comando, pois na verdade, o Netbeans já faz isso durante a execução de qualquer coisa através do F6. Achei interessante compartilhar :slight_smile:

Bom, mesmo na linha de comando, não foi exibido nenhum aviso, durante a execução. :roll:

[]s

Sinceramente não sei como te ajudar. Tudo que eu pensei eu já falei aí para cima.

Só posso desejar boa sorte na resolução do problema.

Feliz Ano Novo!

Vou continuar tentando aqui :slight_smile:

Obrigado. Feliz ano novo :slight_smile:

[]s

Boa tarde,

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;

/**
 *
 * @author Kaos
 */
public class TesteTosco extends JFrame {
    public TesteTosco() {
        ActionListener acao = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Compactador compactador = new Compactador();
                File entrada = new File("E:/backup/Empresa");
                File saidaZip = new File("E:/backup/backup/arquivo.zip");
                try {
                    compactador.executaProcedimentos
                            (entrada.listFiles(), saidaZip);
                } catch (IOException ex) {
                    Logger.getLogger(Main.class.getName()).
                            log(Level.SEVERE, null, ex);
                }
            }
        };

        JButton executar = new JButton("Executa");

        executar.addActionListener(acao);

        this.add(executar);
        this.setSize(400, 300);
        this.setVisible(true);
    }

    public static void main(String args[]) {
        new TesteTosco();
    }

}

Fiz o teste com esse JFrame, colocando um botão apenas para executar, o botão fica “afundado” como se tivesse ficado com o mouse, clicado nele durante todo o tempo de execução. E volta a situação normal depois de comprimir.

Ficou bem claro, que o problema ocorre ao executar esse objeto, através de outros componentes do Swing. Teria por acaso que criar uma thread ou modificar a contrução desse objeto, para conseguir o resultado esperado?

[]s

É, quando se executa processamento pesado, é indicado realizá-lo fora da thread do swing.

Pesquise sobre SwingWorker.

http://download.oracle.com/javase/tutorial/uiswing/concurrency/index.html

http://download.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

Se não me engano, ele foi incorporado ao jdk 6. Antes disso deve fazer o download da API.

Ok. Vou ler os links e posto :slight_smile:

Obrigado

[]s

Boa noite,

Problema resolvido. Segue abaixo código com ajuste:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package fastzip;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.WindowConstants;

/**
 *
 * @author Kaos
 */
public class TesteTosco extends JFrame {
    private File entrada;
    private File saidaZip;
    private Compactador compactador;
    private JButton executar;

    public TesteTosco() {
        this.executar = new JButton("Executa");

        ActionListener acao = new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Runnable tarefa = new Runnable() {
                    @Override
                    public void run() {
                        compactador = new Compactador();
                        entrada = new File("E:/backup/Empresa");
                        saidaZip = new File("E:/backup/backup/arquivo.zip");
                        try {
                            compactador.executaProcedimentos
                                    (entrada.listFiles(), saidaZip);
                        } catch (IOException ex) {
                            Logger.getLogger(TesteTosco.class.getName())
                                    .log(Level.SEVERE, null, ex);
                        }
                        dispose();
                    }
                };
                Thread processo = new Thread(tarefa);
                processo.start();
                setVisible(false);
            }
        };

        this.executar.addActionListener(acao);

        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.add(this.executar);
        this.setResizable(false);
        this.setSize(400, 300);
        this.setLocationRelativeTo(null);
        this.setVisible(true);
    }

    public static void main(String args[]) {
        new TesteTosco();
    }

}

Na linha, 34, começo a criação de uma nova tarefa. Nela coloco os processos a serem executados em uma thread.

Na linha, 50, crio a thread propriamente dita.

Na linha, 51, inicio a execução.

Vi varias formas de realizar a implementação, porém, essa foi a mais pertinente para realizar o ajuste neste caso.

Eric Yuzo, obrigado pelas dicas dadas.

[]s