boa tarde!
eu tenho uma dúvida, quando quero abrir uma janela eu uso o comando jframe.setVisible(true) logo eu deduzi que para fecha-la eu usaria o comando setVisible(false) certo? ou não, pq quando fecho a janela usando esse comando ela continua carregada na memória.
alguem poderia me ajudar?
setVisible(false) descarrega o tal frame, se ele estiver configurado para ser descarregado (ou seja, o JFrame foi configurado com “setDefaultCloseOperation(SwingConstants.DISPOSE_ON_CLOSE)”, se não me engano (não sei isso de cor.)
[quote=thingol]setVisible(false) descarrega o tal frame, se ele estiver configurado para ser descarregado (ou seja, o JFrame foi configurado com “setDefaultCloseOperation(SwingConstants.DISPOSE_ON_CLOSE)”, se não me engano (não sei isso de cor.)
[/quote]
ele está configurado para setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE) pois foi o código gerado pelo netbeans
Para ter um JFrame que encerre toda a aplicação, a propriedade DefaultCloseOperation dele deve estar configurada como EXIT_ON_CLOSE.
Para ter um JFrame que não encerre toda a aplicação, que simplesmente se feche, a propriedade DefaultCloseOperation dele deve estar configurada como DISPOSE_ON_CLOSE.
Lembrando que no NetBeans, é possível alterar essa propriedade clicando com o botão direito do mouse sobre o JFrame em questão e na aba Properties é a primeira propriedade.
No caso de se ter um botão para fechar o JFrame, os códigos:
System.exit(0); encerra a aplicação.
this.dispose(); fecha somente o JFrame em questão, onde this = JFrame.
O método setVisible(); serve somente para exibir ou não o JFrame na tela.
Quanto a alocação e liberação do espaço de memória alocado, é a propria JVM que irá fazer através dos recursos de GarbageCollector, e no momento que ela julgar ser o melhor para não prejudicar a performance do sistema, ela irá remover todo objeto que não possui mais referências e liberar o espaço de memória que foi alocado para ele. http://www.guj.com.br/java.tutorial.artigo.28.1.guj (Muito interessante tbem)
Estou aqui para agradecer por solucionarem esta dúvida.
Ajudou-me demais este comando this.dispose(). funcionou corretamente como eu queria.
Só para ajudar alguém que possa ter o mesmo problema que o meu, eu usei este comando para fechar uma tela de login que
fiz no meu sistema e abrir a tela principal do sistema.
E funcionou corretamente.
Ao logar no sistema, a tela de login fechou e a principal abriu numa boa.
Eu preciso fazer usando While. Estou tentando evitar o erro de exceção.
Mas quero que a aplicação se feche apenas quando o usuário clicar no botão “cancelar” do JOptionPane.
boolean valido = true;
while (true) {
…
}
Ou seja se o usuário deixar algum campo em branco, mostra a mensagem de erro, mas o programa não fecha.
Já pesquisei em vários lugares, mas nada do que encontrei, me atendeu.
To postando o código pra vcs entenderem melhor.
package Atividade6;
import javax.swing.JOptionPane;
/**
*
* @author David Renan
*/
public class Principal {
public static void main(String[] args) {
// TODO code application logic here
//String[] valores;
String valores;
int numeros[], n;
Cadastro cad = new Cadastro();
String entrada;
boolean valido = true;
while (true) {
try {
entrada=JOptionPane.showInputDialog("1- Adicionar sorteio aleatorio \n 2- Adicionar sorteio "
+ "\n 3- Imprimir");
int opcao = Integer.parseInt(entrada);
if (entrada != null) {
if (opcao==1) {
try {
n=Integer.parseInt(JOptionPane.showInputDialog("Quantos elementos terá o vetor?"));
cad.add(new Sena(n));
}
catch (NumberFormatException excecao)
{
JOptionPane.showMessageDialog(null, "Verifique se digitou os dados corretamente.");
}
}
else if (opcao==2) {
try {
valores = JOptionPane.showInputDialog("Entre com os numeros separados por ;");
cad.add(new Sena(valores));
}
catch (NumberFormatException excecao)
{
JOptionPane.showMessageDialog(null, "Verifique se digitou os dados corretamente.");
}
}
else if (opcao==3) {
cad.imprimir();
}
}
}
catch (NumberFormatException excecao) {
JOptionPane.showMessageDialog(null, "Digite a informaçao corretamente");
}
}
}
}
JFrame frame = new JFrame();
frame.setVisible(true);
dispose();
Ah e colocar this.dispose(); dependendo da estrutura fecha todos janelas abertas. Opto por nesse caso somente dispose();