Fechando o programa o java ainda fica em memoria help!

23 respostas
derickcp

galera fiz um programa usando swing mesmo, bem basicao
mas quando fecho ele no x ele continua em memoria
nao deveria
usei o comando

//Main

public static void main( String args[] ){

Inicial inicial = new Inicial();

inicial.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

}

alguma ideia?

23 Respostas

ViniGodoy

Estranho, o programa dispara alguma Thread ou Timer?

Ah sim, e quando postar códigos, siga essas dicas:
http://www.guj.com.br/posts/list/50115.java

Vai deixar tudo muito mais inteligível! :wink:

gilmarcand

Porque você não usa o setDefaultCloseOperation() dentro da classe Inicial?
Bem, de qualquer forma não acredito ser este o problema. Posta pelo menos o código do construtor da class Inicial.

wbjava

Posta mais parte do código pra podermos analisá-lo.

Mas quando for fechar a aplicação pode tentar usar System.exit(0);

X

wbjava:
Posta mais parte do código pra podermos analisá-lo.

Mas quando for fechar a aplicação pode tentar usar System.exit(0);

Uma vez, criei um programa que usava várias threads… ai no botao fechar o this.dispose(); não funcionava e deixava algumas threads em memória… usei o System.exit(0); e deu td certo ! =D
agora se é o correto, não sei !

Se alguém tiver alguma dica, posta ai ! :smiley:

flws :slight_smile:

ViniGodoy

xxta:
Uma vez, criei um programa que usava várias threads… ai no botao fechar o this.dispose(); não funcionava e deixava algumas threads em memória… usei o System.exit(0); e deu td certo ! =D
agora se é o correto, não sei !

Se alguém tiver alguma dica, posta ai ! :smiley:

flws :slight_smile:

Se a sua thread não deve manter o programa vivo, use assim:

Thread t = new Thread(seuRunnable);

t.setDaemon(true);

t.start();

Se só threads daemon existirem, o seu programa fechará. O Java mantém o programa vivo sempre que uma thread não-daemon está rodando.

X

ViniGodoy:
xxta:
Uma vez, criei um programa que usava várias threads… ai no botao fechar o this.dispose(); não funcionava e deixava algumas threads em memória… usei o System.exit(0); e deu td certo ! =D
agora se é o correto, não sei !

Se alguém tiver alguma dica, posta ai ! :smiley:

flws :slight_smile:

Se a sua thread não deve manter o programa vivo, use assim:

Thread t = new Thread(seuRunnable);

t.setDaemon(true);

t.start();

Se só threads daemon existirem, o seu programa fechará. O Java mantém o programa vivo sempre que uma thread não-daemon está rodando.

Correto ! :smiley:
eu usei, mas mesmo assim ele não fechava :confused:

shauhashu
sei la tb…

mas valeu !:smiley:

fantomas

Oi derickcp,

import javax.swing.JFrame;

public class Teste extends JFrame {
	public Teste() {
		super.setSize(100, 100);
		super.setLocation(10, 10);
		super.setVisible(true);
	}

	// Main
	public static void main(String args[]) {
		Teste t = new Teste();
		t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

Testei a pequena parte do seu código e funcionou corretamente, talvez outras partes envolvidas é que estão causando o problema.

[]'s

fantomas

Oi derickcp,

Desculpem a versão anterior ficou horrivel! :?

import javax.swing.JFrame;

public class Teste extends JFrame {
public Teste() {
super.setSize(100, 100);
super.setLocation(10, 10);
super.setVisible(true);
}

// Main
public static void main(String args[]) {
Teste t = new Teste();
t.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Testei a pequena parte do seu código e funcionou corretamente, talvez outras partes envolvidas é que estão causando o problema.

[]'s

derickcp

pelo que li aki
eu estou usando o dispose() para trocar de tela;

vou fazer uns testes quando chegar em casa
ate agora agradeco
e pode deixar que se eu achar ou nao o problema eu aviso

vou testar com esse aki

Thread t = new Thread(seuRunnable);

t.setDaemon(true);

t.start();
derickcp

tinha colocado o codigo sem o code ai postei de novo
nao tinha visto que dava para editar
ta ai abaixo o codigo
rs rs

derickcp

nao tive resultados positivos nao continua na mesma
vo passar para vcs um pedaco do codigo para quem sabe alguem conseguir me ajudar
meu programa a primeira vez que ele abre, carrega na memoria arquivos txt
assim podendo depois navegar em outras partes


ESSA CLASSE SOH CARREGA OS DADOS NA MEMORIA E CHAMA A TELA INICIAL
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;
import java.util.List;

import tk.dimensaonet.aviclasp.bean.Bairros;
import tk.dimensaonet.aviclasp.bean.Categorias;
import tk.dimensaonet.aviclasp.bean.Cidades;
import tk.dimensaonet.aviclasp.bean.EmpresaCategorias;
import tk.dimensaonet.aviclasp.bean.Empresas;
import tk.dimensaonet.aviclasp.bean.Ruas;
import tk.dimensaonet.aviclasp.main.Inicial;


public class CapturarDados {
	
	public static List<Empresas> listaEmpresa = new ArrayList<Empresas>();
		
	@SuppressWarnings("deprecation")
	public static void main(String Args[]){
		
		try {
			
			gravaDados();
			Inicial inicial = new Inicial(listaEmpresa);
			inicial.show();
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}

	private static void gravaDados() throws FileNotFoundException, IOException {
		
		String linha = null;
		String[] aux;
		int i = 0;

		Empresas empresas = new Empresas();
		
		InputStream in = CapturarDados.class.getResourceAsStream("dadosAviclasp.txt");

               Reader reader = new InputStreamReader(in);
               BufferedReader leitor = new BufferedReader(reader);
		while ((linha = leitor.readLine()) != null) {
		 	i=0;
			aux = linha.split(",");
			empresas = new Empresas();
			empresas.setCodigo(Integer.parseInt(aux[i++]));
			empresas.setEmpresa(aux[i++]);
			empresas.setDescricao(aux[i++]);
			empresas.setLetraInicial(aux[i++]);
			empresas.setTipoLogradouro(aux[i++]);
			empresas.setEndereco(aux[i++]);
			empresas.setNumero(aux[i++]);
			empresas.setComplemento1(aux[i++]);
			empresas.setComplemento2(aux[i++]);
			empresas.setCep(aux[i++]);
			empresas.setCidade(aux[i++]);
			empresas.setUf(aux[i++]);
			empresas.setBairro(aux[i++]);
			empresas.setDddTel1(aux[i++]);
			empresas.setTel1(aux[i++]);
			empresas.setDddTel2(aux[i++]);
			empresas.setTel2(aux[i++]);
			empresas.setDddTel3(aux[i++]);
			empresas.setTel3(aux[i++]);
			empresas.setDddTel4(aux[i++]);
			empresas.setTel4(aux[i++]);
			empresas.setDddCel(aux[i++]);
			empresas.setCel(aux[i++]);
			empresas.setDddFax(aux[i++]);
			empresas.setFax(aux[i++]);
			empresas.setSite(aux[i++]);
			empresas.setEmail(aux[i++]);
			empresas.setCaminhoFoto(aux[i++]);
			empresas.setTipoFoto(aux[i++]);
			listaEmpresa.add(empresas);
		}
		
	}
	
}

ESSA EH A TELA INICIAL
package tk.dimensaonet.aviclasp.main;

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

import tk.dimensaonet.aviclasp.bean.Bairros;
import tk.dimensaonet.aviclasp.bean.Categorias;
import tk.dimensaonet.aviclasp.bean.Cidades;
import tk.dimensaonet.aviclasp.bean.EmpresaCategorias;
import tk.dimensaonet.aviclasp.bean.Empresas;
import tk.dimensaonet.aviclasp.bean.Ruas;

@SuppressWarnings("serial")
public class Inicial extends JFrame{

	private JLabel lblLogo;
	private JLabel lblAnuncieAqui;
	private JButton cmdInicio;
	//private JPanel jPanel1;
	private JLabel lblBanner1;
	private JLabel lblBanner2;
	private JLabel lblBanner3;
	private JLabel lblBanner4;
	private JLabel lblBanner5;
	private JLabel lblMarcaDAgua;
	
	private JButton cmdClassificados;
	private JButton cmdAssinantes;
	private JButton cmdEnderecos;
	
	
	private List<Empresas> listaEmpresa = null;
		
	public Inicial(){
		Inicial inicial = new Inicial(listaEmpresa);
	}

	public Inicial(List<Empresas> empresas){
		
		super( "AviclaSP ::: www.aviclasp.com.br" );
				
		listaEmpresa = empresas;
				
		setSize( 800, 600 );
		
                setResizable(false);
        
        getContentPane().setLayout(null);
        getContentPane().setBackground( Color.WHITE );
        
        cmdInicio = new JButton();
		getContentPane().add(cmdInicio);
		cmdInicio.setText("Inicio");
		cmdInicio.setBounds(12, 144, 143, 48);

        cmdClassificados = new JButton();
    	getContentPane().add(cmdClassificados);
    	cmdClassificados.setText("Classificados");
    	cmdClassificados.setBounds(12, 211, 143, 50);

    	cmdEnderecos = new JButton();
    	getContentPane().add(cmdEnderecos);
    	cmdEnderecos.setText("Endereços");
    	cmdEnderecos.setBounds(12, 280, 143, 50);

    	cmdAssinantes = new JButton();
    	getContentPane().add(cmdAssinantes);
    	cmdAssinantes.setText("Assinantes");
    	cmdAssinantes.setBounds(12, 347, 143, 50);

    	labels e mais labels

    	//Adiciona botoes ao addActionListener
        ButtonHandler handler = new ButtonHandler();
        cmdClassificados.addActionListener( handler );
        cmdEnderecos.addActionListener( handler );
        cmdAssinantes.addActionListener( handler );
        
        setVisible( true );
        
	}
	
	//Evento dos botoes
	private class ButtonHandler implements ActionListener {

		public void actionPerformed( ActionEvent e ){
			//Botao Classificados
			if (e.getSource() == cmdClassificados){
				Classificados classificados = new Classificados(listaEmpresa);
				dispose();
			}
			//Botao Endereco
			if (e.getSource() == cmdEnderecos){
				Enderecos enderecos = new Enderecos(listaEmpresa);
				dispose();
			}
			//Botao Assinantes
			if (e.getSource() == cmdAssinantes){
				Assinantes assinantes = new Assinantes(listaEmpresa);
				dispose();
			}
      	        }
	}
	
	//Main
	public static void main( String args[] ){
		Inicial inicial = new Inicial();
		inicial.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
    }
}
OBS:

mesmo se eu ja clicar no X

o programa fecha mas ainda continua em memoria

eu tentei usar o implement Runnable

e depois usar o

Thread t = new Thread();

t.setDaemon(true);

t.start();

mas deu na mesma
se alguem souber e puder me ajudar agradeco muito

ViniGodoy

Esse seu construtor está completamente errado:

public Inicial(){ Inicial inicial = new Inicial(listaEmpresa); }

O que vc quer com isso? listaEmpresa nem existe direito ainda.

Acho que o que vc quer é:

public Inicial(){ //Chama o construtor com uma lista vazia. this(new ArrayList<Empresas>()); }
Você está criando 2 frames.

ViniGodoy

Outra coisa,

Os warnings existem para te avisar de potenciais problemas. Procure corrigi-los ao invés de suprimi-los. O único que eu recomendaria desligar é o de serialVersionUID, que só serve se vc realmente trabalhar muito com serialização.

derickcp

entao eu udei o

public Inicial(){    
      Inicial inicial = new Inicial(listaEmpresa);    
   }

para ele mandar para a tela inicial os dados das empresas
que sera usada em outra tela

o problema que encontrei foi o seguinte
no comeco eu carreguei tudo em memoria
deixei-os publicos
e acessava das outras telas
quando comecei a executar direto do jar
isso nao acontecia eu nao tinha os valores na memoria
entao comecei a passar os dados pelas telas

ViniGodoy

O construtor daquele jeito que vc fez tem três sérios problemas:

  1. Ele não seta campo nenhum;
  2. Ele não usa a variável criada para nada;
  3. Ele cria 2 frames ao invés de um. Um deles acaba sendo criado pela metade.

Definitivamente, um construtor não deve ser usado daquele jeito. Use com o this como eu falei.

derickcp

desculpa a ignorancia
mas nao entendi como devo fazer
pode me dar um exemplo?

fantomas

Oi derickcp,

Concordo com o ViniGodoy.

derickcp:
para ele mandar para a tela inicial os dados das empresas
que sera usada em outra tela

o problema que encontrei foi o seguinte
no comeco eu carreguei tudo em memoria
deixei-os publicos
e acessava das outras telas
quando comecei a executar direto do jar
isso nao acontecia eu nao tinha os valores na memoria
entao comecei a passar os dados pelas telas

Tô achando que vc fêz aquilo para escapar de um outro problema, se isso for verdade, aplique as sugestões do ViniGodoy e vamos começar a história de novo (com + detalhes e posts de código).

Desculpe se não entendi direito.

[]'s

ViniGodoy

Eu já dei o exemplo:

public Inicial(){  
    //Chama o construtor com uma lista vazia.
    this(new ArrayList<Empresas>()); 
}
derickcp

mas eu preciso da lista com os parametros que sao carregados da primeira tela
pra que vou passar algo vaziu?

fantomas

Hummm....acho que estou entendendo este seu "mozaico", vamos lá...

public Inicial(){  
        Inicial inicial = new Inicial(listaEmpresa);  
 }  
   
 public Inicial(List<Empresas> empresas){  
        setVisible( true );  
 }

//Main  
public static void main( String args[] ){  
        Inicial inicial = new Inicial();  
        inicial.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );  
 }

HIPÓTESE do porque a tela fecha mas continua executando:

O construtor Inicial() aciona o outro construtor Inicial(List empresas) que constroi um objeto com o atributo visible igual a true que é a janela que VOCÊ ESTA VISUALIZANDO; o construtor anterior, o Inicial() constroi um objeto com o atributo visible igual a false que é a janela que VOCÊ NÂO ESTA VISUALIZANDO.

O objeto ( QUE VOCÊ NÂO ESTA VISUALIZANDO ) construido pelo construtor Inicial() é atribuido à variável inicial no método main, onde tudo começou, logo em seguida vc atribuiu o valor JFrame.EXIT_ON_CLOSE no atributo defaultCloseOperation à este objeto.

CONCLUSÂO: Como você não está VISUALIZANDO o objeto construido pelo construtor Inicial() vc não tem como "clicar" no ícone fechar da janela, porem, vc está VISUALIZANDO o objeto construido pelo construtor Inicial(List empresas) e o atributo defaultCloseOperation deste objeto não recebeu o valor JFrame.EXIT_ON_CLOSE; porque todos os atributos foram definidos dentro do próprio construtor e a referencia para este objeto ficou sob o domínio do construtor Inicial().

SUGESTÃO:

Tente fazer o seguinte:

public Inicial(){  
        Inicial inicial = new Inicial(listaEmpresa);  
 }  
   
 public Inicial(List<Empresas> empresas){  
        setVisible( true );  
        setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );  
 }

//Main  
public static void main( String args[] ){  
        Inicial inicial = new Inicial();  
 }

Olhando para o método main fica uma dúvida...e o objeto construido pelo construtor Inicial()? vai ficar invisivel :?:

Espero não ter confundido tudo rsrsrsrs.

[]'s

ViniGodoy

Vai sim, pq o default close operation de um JFrame é HIDE_ON_CLOSE. Pode olhar no JavaDoc do setDefaultCloseOperation.

O problema é esse mesmo. Ele mostra um outro JFrame, que está com DefaultCloseOperation como HIDE_ON_CLOSE. Mas a propriedade que ele altera é do JFrame que ele não mostra.

Aí, quando ele manda o frame que ele mostra se fechar, o frame só se esconde e mantém a aplicação viva.
Enquanto que o frame que ele criou e definiu como “DISPOSE_ON_CLOSE” nunca ficou visível.

Então, há duas recomendações:

  1. Faça o construtor do jeito que eu recomendei e
  2. Dê o setDefaultCloseOperation no próprio construtor do seu JFrame.
fantomas

É isso ai…a minha pergunta sobre a visibilidade do objeto construido pelo construtor Inicial() referia-se aos motivos prá isso.

Resumindo: Um objeto visual que não se vê em momento algum, não parece ser uma boa idéia. Vai ver o método man é apenas um teste e na execução normal isso faça sentido, enfim…

Acho que se derickcp fizesse uma revisão e desse uma olhada em alguns padrões descobria algumas formas legais de montar estas classes.

flw

derickcp

beleza vou dar uma revisada e ver se descubro algum modo melhor de fazer esse programa
agradeço pela paciencia
abracos

Criado 29 de julho de 2008
Ultima resposta 31 de jul. de 2008
Respostas 23
Participantes 6