Fechar JDialog por botão

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.

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…

1 curtida

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.

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!

Amigo, use:

this.dispose();

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.

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.

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:

[code]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[/code]

Boa sorte! :wink:

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); } });

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.

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

nome_do_seu_JDialog.setVisible(false); 

Ok?

Agora deve funcionar.

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

[code]

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);
}

}[/code]

obs.: onde está

emitirCert.setVisible(false);

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

Obrigado de novo.

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

Meu teste:

[code]/*

  • 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);
    }

}[/code]

Código do Main:

[code]/*

  • 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();
      }

}[/code]

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

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.

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);
    }
    
    
}

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…

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:

ERRO

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.