Fechar JDialog por botão

18 respostas
irk

Tenho uma JDialog (2ª tela do programa) que tem um botão para fechá-la. Qual seria o evento que tenho que associar ao botão?
Já tentei:

System.exit(0);

e

minhaJanela.setDefaultClosedAction(JFrame.EXIT_ON_CLOSE);

Muito obrigado.

18 Respostas

F

Olá tudo bem…

se vc quiser que feche somente a janela, que esta aberta, e não o programa inteiro, vc poder fazer assim:

this.hide();

ou System.exit(0); para fechar o sistema inteiro…

FLW…

Abraços…

eros.stein

Se quer fechar a JDialog, pode usar:

setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);

Assim quando clicar no botão fechar a caixa de diálogo será fechada.

irk

Fabio e eros.stein, eu tentei dos dois jeitos que vocês falaram, mas não funcionaram também. Vou por o código aki embaixo para que vocês possam entender melhor.

import javax.swing.JDialog;
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class tela_01 extends JDialog implements ActionListener {

		public JLabel lbl_pessoa, lbl_palestra;
		public JButton bt_visualiza, bt_cancela;
		public JComboBox txt_pessoa, txt_palestra;
	
	public void t_01() {
		tela_01 emitirCert = new tela_01();
		
		emitirCert.setTitle("Digitar dados");
		emitirCert.setSize(300,300);
		emitirCert.setResizable(false);
		emitirCert.setModal(true);
		emitirCert.alignCenter();
		emitirCert.getContentPane().setLayout(null);
		
		lbl_pessoa = new JLabel("Nome participante:");
		lbl_pessoa.setBounds(10,10,120,20);
		emitirCert.getContentPane().add(lbl_pessoa);
        
        lbl_palestra = new JLabel("Nome palestra:");
		lbl_palestra.setBounds(10,70,120,20);
        emitirCert.getContentPane().add(lbl_palestra);
		
		txt_pessoa = new JComboBox();
		txt_pessoa.setBounds(10,40,200,20);
		txt_pessoa.setEditable(true);
        emitirCert.getContentPane().add(txt_pessoa);
        
        txt_palestra = new JComboBox();
		txt_palestra.setBounds(10,100,200,20);
		txt_palestra.setEditable(true);
        emitirCert.getContentPane().add(txt_palestra);
        
        bt_visualiza = new JButton("Visualizar");
        bt_visualiza.setBounds(15,130,120,20);
        bt_visualiza.setEnabled(true);
        emitirCert.getContentPane().add(bt_visualiza);
        
        bt_cancela = new JButton("Cancelar");
        bt_cancela.setBounds(150,130,120,20);
        bt_cancela.setEnabled(true);
        bt_cancela.addActionListener(this);
        emitirCert.getContentPane().add(bt_cancela);
        
        emitirCert.setVisible(true); 
        
	}
    
    public void alignCenter() {
        Dimension t = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension j = getSize();
        setLocation((t.width-j.width)/2,(t.height-j.height)/2);
    }
    
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == bt_cancela) {
        setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);
        	/*this.hide();*/
        }
}
}

O código da janel aprincipal que chama está no link abaixo:

http://www.guj.com.br/posts/list/69512.java

Obrigado pela ajuda prestada até o momento. Até mais!

RenataFA

Amigo, use:

this.dispose();

eros.stein

E o setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);
é pra ser usado de outra forma:

seu_JDialog.setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);

e isso no método de criação, não no recebimento do evento.
No recebimento do evento pode ainda colocar setVisible(false);
Poste se conseguir.

Abraço.

irk

Obrigado pela ajuda eros.stein e reanaFA, mas não funcionou ou eu coloquei o comando no local errado. Eu sei que já devo estar enchendo vocês, mas ainda preciso de ajuda. Não sei se fui claro, mas eu quero quero que a minha JDialog feche por um botão “Cancela” criado por mim, não pelo “X” da janela. Segue a baixo o código com as mudanças já tentadas.

import javax.swing.JDialog;
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class tela_01 extends JDialog implements ActionListener {

		public JLabel lbl_pessoa, lbl_palestra;
		public JButton bt_visualiza, bt_cancela;
		public JComboBox txt_pessoa, txt_palestra;
	
	public void t_01() {
		tela_01 emitirCert = new tela_01();
		
		emitirCert.setTitle("Digitar dados");
		emitirCert.setSize(300,300);
		emitirCert.setResizable(false);
		emitirCert.setModal(true);
		emitirCert.alignCenter();
		emitirCert.getContentPane().setLayout(null);
		
		lbl_pessoa = new JLabel("Nome participante:");
		lbl_pessoa.setBounds(10,10,120,20);
		emitirCert.getContentPane().add(lbl_pessoa);
        
        lbl_palestra = new JLabel("Nome palestra:");
		lbl_palestra.setBounds(10,70,120,20);
        emitirCert.getContentPane().add(lbl_palestra);
		
		txt_pessoa = new JComboBox();
		txt_pessoa.setBounds(10,40,200,20);
		txt_pessoa.setEditable(true);
        emitirCert.getContentPane().add(txt_pessoa);
        
        txt_palestra = new JComboBox();
		txt_palestra.setBounds(10,100,200,20);
		txt_palestra.setEditable(true);
        emitirCert.getContentPane().add(txt_palestra);
        
        bt_visualiza = new JButton("Visualizar");
        bt_visualiza.setBounds(15,130,120,20);
        bt_visualiza.setEnabled(true);
        emitirCert.getContentPane().add(bt_visualiza);
        
        bt_cancela = new JButton("Cancelar");
        bt_cancela.setBounds(150,130,120,20);
        bt_cancela.setEnabled(true);
        bt_cancela.addActionListener(this);
        emitirCert.getContentPane().add(bt_cancela);
        
        emitirCert.setVisible(true);
        emitirCert.setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);
        
	}
    
    public void alignCenter() {
        Dimension t = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension j = getSize();
        setLocation((t.width-j.width)/2,(t.height-j.height)/2);
    }
    
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == bt_cancela) {
        setVisible(false);
        this.dispose();
        this.hide();
        }
}
}

Obrigado de novo.

RenataFA

Amigo, coloque apenas isso:

public void actionPerformed(ActionEvent e) {  
    if(e.getSource() == bt_cancela) {  
        this.dispose();  
    }  
}

Se por acaso quiser DESABILITAR tb a função do X do JDialog, para que só seja possível sair clicando no seu botão, coloque tb. esse código:

public void t_01() {  
    tela_01 emitirCert = new tela_01();  

    setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);

    // segue o resto do seu código normalmente

Boa sorte! :wink:

eros.stein

Um outro modo seria assim…

Na linha 50:

bt_cancela.addActionListener(this);

substitua por:

bt_cancela.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { setVisible(false); } });

irk

Caramba, esse programa deve estar “zicado”. Tentei as soluções apresentadas por vocês, mas não funcionaram. Só a de desabilitar a o “X” da janela funcionou. Se alguém conseguir fazer funcionar, por favor poste o código aqui. O brigado pela ajuda até o momento.

eros.stein

Desculpe, esqueci de um detalhe. Aqui: setVisible(false);
coloque:

nome_do_seu_JDialog.setVisible(false);

Ok?

Agora deve funcionar.

irk

Eu realizei a mudança eros.stein, mas não funcionou também. Segue o código.

import javax.swing.JDialog;
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class tela_01 extends JDialog implements ActionListener{

		public JLabel lbl_pessoa, lbl_palestra;
		public JButton bt_visualiza, bt_cancela;
		public JComboBox cmb_pessoa, cmb_palestra;
		public JTextField txt_pessoa;
		
		String[] Cores[]= {null};
	
	public void t_01() {
		tela_01 emitirCert = new tela_01();
		
		emitirCert.setTitle("Digitar dados");
		emitirCert.setSize(300,300);
		emitirCert.setResizable(false);
		emitirCert.setModal(true);
		emitirCert.alignCenter();
		emitirCert.getContentPane().setLayout(null);
		
		lbl_pessoa = new JLabel("Nome participante:");
		lbl_pessoa.setBounds(10,10,120,20);
		emitirCert.getContentPane().add(lbl_pessoa);
        
        lbl_palestra = new JLabel("Nome palestra:");
		lbl_palestra.setBounds(10,70,120,20);
        emitirCert.getContentPane().add(lbl_palestra);
		
        txt_pessoa = new JTextField();
        txt_pessoa.setBounds(10,160,200,20);
        txt_pessoa.setEditable(true);
        emitirCert.getContentPane().add(txt_pessoa);
        
        cmb_pessoa = new JComboBox();
		cmb_pessoa.setBounds(10,40,200,20);
		cmb_pessoa.setEditable(true);
        emitirCert.getContentPane().add(cmb_pessoa);
        
        cmb_palestra = new JComboBox(Cores);
		cmb_palestra.setBounds(10,100,200,20);
		cmb_palestra.setEditable(true);
		getContentPane().add(new JLabel("Cores"));
        emitirCert.getContentPane().add(cmb_palestra);
        
        bt_visualiza = new JButton("Visualizar");
        bt_visualiza.setBounds(15,130,120,20);
        bt_visualiza.setEnabled(true);
        emitirCert.getContentPane().add(bt_visualiza);
        /*bt_visualiza.addActionListener(this);*/
        
        bt_cancela = new JButton("Cancelar");
        bt_cancela.setBounds(165,130,120,20);
        bt_cancela.setEnabled(true);
        emitirCert.getContentPane().add(bt_cancela);
        bt_cancela.addActionListener(new ActionListener() {  
        public void actionPerformed(ActionEvent event) {  
        emitirCert.setVisible(false);  
        }  
        });
        /*bt_cancela.addActionListener(this);*/
        /*Desabilita o X da janela
         * emitirCert.setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);*/
		    
        emitirCert.setVisible(true);
        
	}
	

	
    
    public void alignCenter() {
        Dimension t = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension j = getSize();
        setLocation((t.width-j.width)/2,(t.height-j.height)/2);
    }
    
    
}

obs.: onde está

emitirCert.setVisible(false);

eu tembém já tentei as classes t_01 e tela_01.

Obrigado de novo.

eros.stein

Olha, acabei de testar seu código, e aqui funcionou. Confira:

Meu teste:

/*
 * JDialogTest.java
 *
 * Created on 21 de Setembro de 2007, 02:01
 *
 */

package jdialogtest;

import javax.swing.JDialog;
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 *
 * @author Eros Stein
 */
public class JDialogTest extends JDialog {
    
    public JLabel lbl_pessoa, lbl_palestra;
    public JButton bt_visualiza, bt_cancela;
    public JComboBox cmb_pessoa, cmb_palestra;
    public JTextField txt_pessoa;
    
    String[] Cores[]= {null};
    
    /** Creates a new instance of JDialogTest */
    public JDialogTest() {
    }
    
    public void t_01() {
        final JDialogTest dialog = new JDialogTest();
        dialog.setTitle("Digitar dados");
        dialog.setSize(300,300);
        dialog.setResizable(false);
        dialog.alignCenter();
        dialog.setModal(true);
        dialog.getContentPane().setLayout(null);
        lbl_pessoa = new JLabel("Nome participante:");
        lbl_pessoa.setBounds(10,10,120,20);
        dialog.getContentPane().add(lbl_pessoa);
        
    lbl_palestra = new JLabel("Nome palestra:");
		lbl_palestra.setBounds(10,70,120,20);
        dialog.getContentPane().add(lbl_palestra);
		
        txt_pessoa = new JTextField();
        txt_pessoa.setBounds(10,160,200,20);
        txt_pessoa.setEditable(true);
        dialog.getContentPane().add(txt_pessoa);
        
        cmb_pessoa = new JComboBox();
		cmb_pessoa.setBounds(10,40,200,20);
		cmb_pessoa.setEditable(true);
        dialog.getContentPane().add(cmb_pessoa);
        
        cmb_palestra = new JComboBox(Cores);
		cmb_palestra.setBounds(10,100,200,20);
		cmb_palestra.setEditable(true);
		getContentPane().add(new JLabel("Cores"));
        dialog.getContentPane().add(cmb_palestra);
        
        bt_visualiza = new JButton("Visualizar");
        bt_visualiza.setBounds(15,130,120,20);
        bt_visualiza.setEnabled(true);
        dialog.getContentPane().add(bt_visualiza);
        /*bt_visualiza.addActionListener(this);*/
        
        bt_cancela = new JButton("Cancelar");
        bt_cancela.setBounds(165,130,120,20);
        bt_cancela.setEnabled(true);
        dialog.getContentPane().add(bt_cancela);
        bt_cancela.addActionListener(new ActionListener() {  
        public void actionPerformed(ActionEvent event) {  
        dialog.setVisible(false);  
        }  
        });
		    
        dialog.setVisible(true);
        
	}
    
    public void alignCenter() {
        Dimension t = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension j = getSize();
        setLocation((t.width-j.width)/2,(t.height-j.height)/2);
    }
    
    
}

Código do Main:

/*
 * Main.java
 *
 * Created on 21 de Setembro de 2007, 02:00
 */

package jdialogtest;

/**
 *
 * @author Eros Stein
 */
public class Main {
    
    /** Creates a new instance of Main */
    public Main() {
    }
    
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        JDialogTest tela = new JDialogTest();
        tela.t_01();
    }
    
}

Confira aí, pois aqui este código funcionou, a janela sumiu normalmente.

eros.stein

Compare o seu código com o meu e faça as alterações. Rode meu teste para confirmar ver que está funcionando.

Espero que agora consiga, abraços.

irk

Muito obrigado eros.stein. E não é que funcionou??? agora vou ver se eu acho o que eu estava fazendo de errado. Valeu mesmo. Até mais.

tela funcionando

import javax.swing.JDialog;
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class tela_01 extends JDialog {

		public JLabel lbl_pessoa, lbl_palestra;
		public JButton bt_visualiza, bt_cancela;
		public JComboBox cmb_pessoa, cmb_palestra;
		/*public JTextField txt_pessoa;*/
		
		String[] Cores[]= {null};
	
	
		public tela_01() {
			
		}
		
		public void t_01() {
		final tela_01 emitirCert = new tela_01();
		
		emitirCert.setTitle("Digitar dados");
		emitirCert.setSize(300,300);
		emitirCert.setResizable(false);
		emitirCert.setModal(true);
		emitirCert.alignCenter();
		emitirCert.getContentPane().setLayout(null);
		
		lbl_pessoa = new JLabel("Nome participante:");
		lbl_pessoa.setBounds(10,10,120,20);
		emitirCert.getContentPane().add(lbl_pessoa);
        
        lbl_palestra = new JLabel("Nome palestra:");
		lbl_palestra.setBounds(10,70,120,20);
        emitirCert.getContentPane().add(lbl_palestra);
		
        /*txt_pessoa = new JTextField();
        txt_pessoa.setBounds(10,160,200,20);
        txt_pessoa.setEditable(true);
        emitirCert.getContentPane().add(txt_pessoa);*/
        
        cmb_pessoa = new JComboBox();
		cmb_pessoa.setBounds(10,40,200,20);
		cmb_pessoa.setEditable(true);
        emitirCert.getContentPane().add(cmb_pessoa);
        
        cmb_palestra = new JComboBox(Cores);
		cmb_palestra.setBounds(10,100,200,20);
		cmb_palestra.setEditable(true);
		getContentPane().add(new JLabel("Cores"));
        emitirCert.getContentPane().add(cmb_palestra);
        
        bt_visualiza = new JButton("Visualizar");
        bt_visualiza.setBounds(15,130,120,20);
        bt_visualiza.setEnabled(true);
        emitirCert.getContentPane().add(bt_visualiza);
        /*bt_visualiza.addActionListener(this);*/
        
        bt_cancela = new JButton("Cancelar");
        bt_cancela.setBounds(165,130,120,20);
        bt_cancela.setEnabled(true);
        emitirCert.getContentPane().add(bt_cancela);
        bt_cancela.addActionListener(new ActionListener() {    
        public void actionPerformed(ActionEvent event) {    
        emitirCert.setVisible(false);    
         }    
        }
        );
        /*bt_cancela.addActionListener(this);*/
        /*Desabilita o X da janela
         * emitirCert.setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);*/
		    
        emitirCert.setVisible(true);
        
	}
	

	
    
    public void alignCenter() {
        Dimension t = Toolkit.getDefaultToolkit().getScreenSize();
        Dimension j = getSize();
        setLocation((t.width-j.width)/2,(t.height-j.height)/2);
    }
    
    
}
RenataFA

Gente, só cuidado com uma coisinha…

Qdo vc usa .setVisible(false) vc está deixando o JDialog invisível, mas ele ainda existe! Ou seja, ele ainda está ocupando memória, etc, etc… Quando vc usa .dispose() vc “mata” ele… Entendem?

Por isso, veja bem qual é o uso no seu caso…

RenataFA

ERRO

OBS: Me desculpem! Não sei oque tem acontecido com o GUJ. Eu mando enviar uma resposta, ele demora pacas, dá erro de proxy e qdo volto na página o post foi duplicado… :cry:

RenataFA

ERRO

irk

Muito obrigado pela dica renataFA. Eu tinha meio que ficado na dúvida mesmo se quando você usa o setVisible ele finaliza ou apenas “esconde” a janela. Eu usei o dipose no código e funcionou. Acho que o problema era quando eu relacionava o evento ao botão, porque eu tinha tentado antes mas não consegui. Depois que o eros.stein me deu umas dicas, funcionou com o setVisible, e agora com a sua ajuda funcionou com o dispose. Obrigado.

Criado 18 de setembro de 2007
Ultima resposta 21 de set. de 2007
Respostas 18
Participantes 4