JDialog está sendo reaberto automaticamente

Olá pessoal…

Estou tendo o seguinte problema: quando eu tento fechar a janela aberta pelo botão “Abrir JDialog”, a janela é reaberta novamente automaticamente. Alguém sabe o que possa estar acontecendo?

package testejdialog2;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;

public class Janela2 extends JFrame {

	private JButton button = new JButton("Abrir JDialog");
	
	public Janela2() {
		super("Teste JDialog");
		
		init();
	}
	
	private void init() {
		montarJanela();
		montarJDialog();
		mostrarJanela();
	}
	
	private void montarJanela() {
		setLayout(new FlowLayout());
		setSize(500, 500);
		montarJDialog();
	}
	
	private void mostrarJanela() {
		setLocationRelativeTo(null);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	private void montarJDialog() {
		button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				new Teste();
			}
		});
		add(button);
	}
	
	public static void main(String[] args) {
		new Janela2();
	}
}

class Teste extends JDialog {
	
	private JButton button;
	
	public Teste() {
		super(new JFrame(), "Teste", true);
		
		init();
	}
	
	private void init() {
		montarJanela();
		montarComponentes();
		mostrarJanela();
	}
	
	private void montarJanela() {
		setSize(200, 200);
		setLayout(new FlowLayout());
	}
	
	private void mostrarJanela() {
		setLocationRelativeTo(this.getParent());
		setVisible(true);
		setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
	}
	
	private void montarComponentes() {
		button = new JButton("Adicionar");
		add(button);
	}

}

Mude o parametro de fechamento para:

setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE); 

Eu não quero fechar a aplicação quando eu fechar o JDialog.

Se você executar o meu código, verá que após clicar em “Abrir JDialog” é aberta a janelinha normalmente, porém se eu tentar fechá-la pelo “x”, a janela não irá fechar, porém se eu clicar novamente no “x” a janela é fechada. O que eu acho que está acontecendo é que após a janela ser fechada ela é reaberta automaticamente, agora porquê…eis a questão.

:?: :?: :?: :?: :?: :?:

Vc acha demais.

Vc tentou o que eu sugeri???

Eu testei o teu codigo, vi o que esta acontecendo e corrigi com a minha sugestao.

No teu Dialog (NAO NO TEU JFRAME) no parametro de fechamento coloque o que eu sugeri e a janelinha ira fechar no primeiro clic no x.

Nao tem nada a ver com fechar a aplicacao. A aplicacao vai continuar aberta e vc pode reabrir o dialog e fecha-lo novamente no x

Você se ofendeu com a minha resposta JoaoBluSCBR ?
Você é um profissional ou o que?
Lógico que eu tentei o que vc sugeriu.

Nao me ofendi, mas eu tive o trabalho de copiar teu codigo,
criar um projeto e resolvi com a simples mudanca de parametro
o teu problema.

Entao nao consegui entender por que voce falou em fechar a aplicacao.

Se colocou o parametro no SetDeaulfClose do Dialog e ele foi chamado
pelo Frame, nao tem como isso fechar tua aplicacao.

Só pude imaginar que você colocou o parametro no JFrame e nao no JDialog.

Pra mim funcionou entao…

Então já que vc executou uma vez, não se importaria de executar duas vezes?
Eu acho.

import java.awt.FlowLayout;   
import java.awt.event.ActionEvent;   
import java.awt.event.ActionListener;   
import javax.swing.JButton;   
import javax.swing.JDialog;   
import javax.swing.JFrame;   
  
public class Janela2 extends JFrame {   
  
    private JButton button = new JButton("Abrir JDialog");   
       
    public Janela2() {   
        super("Teste JDialog");   
           
        init();   
    }   
       
    private void init() {   
        montarJanela();   
        montarJDialog();   
        mostrarJanela();   
    }   
       
    private void montarJanela() {   
        setLayout(new FlowLayout());   
        setSize(500, 500);   
        montarJDialog();   
    }   
       
    private void mostrarJanela() {   
        setLocationRelativeTo(null);   
        setVisible(true);   
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
    }   
       
    private void montarJDialog() {   
        button.addActionListener(new ActionListener() {   
            @Override   
            public void actionPerformed(ActionEvent e) {   
                new Teste();   
            }   
        });   
        add(button);   
    }   
       
    public static void main(String[] args) {   
        new Janela2();   
    }   
}   
  
class Teste extends JDialog {   
       
    private JButton button;   
       
    public Teste() {   
        super(new JFrame(), "Teste", true);   
           
        init();   
    }   
       
    private void init() {   
        montarJanela();   
        montarComponentes();   
        mostrarJanela();   
    }   
       
    private void montarJanela() {   
        setSize(200, 200);   
        setLayout(new FlowLayout());   
    }   
       
    private void mostrarJanela() {   
        setLocationRelativeTo(this.getParent());   
        setVisible(true);   
        setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);   
    }   
       
    private void montarComponentes() {   
        button = new JButton("Adicionar");   
        add(button);   
    }   
  
}  

Fiz o novo teste, realmente nao era aquilo, mas agora ficou claro:

modifiquei esse teu código para fazer um teste:

private void montarJDialog() {     
        /*button.addActionListener(new ActionListener() {     
            @Override     
            public void actionPerformed(ActionEvent e) {     
                new Teste();     
            }     
        }); */
        
        button.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                new Teste();
            }
        });
    }  

Coloquei um breakpoint na linha new Teste();

e interessante, nao importa que evento use (usei o mouseclicked) e mesmo
assim quando a tela do dialog eh fechada, o evento inicial eh duplicado.

Ou seja, o evento de clic que abriu o JDialog eh disparado novamente quando
a telinha do Dialog eh fechada. Eh como se ele ficasse pendente na memoria
e fosse novamente disparado.

Nao sei por que!!!

Revendo agora o teu codigo pelo prisma do evento duplicado notei que o
evento está dentro do codigo do metodo MontarJDialog e esse metodo
eh chamado 2 vezes, uma no init() e outra no MontarJanela.

Entao estao sendo montados 2 listeners na memoria. Cada um deles
sendo colocado na pilha para efetuar o evento em sequencia.

Entao o clic do botao gera a abertura da janela e quando ela eh
fechada, a pilha busca novamente o proximo listener e o efetua.

Tire essa duplicacao e creio que funcionará corretametne.

Desta vez nao testei.

O Joao quase acertou. Na verdade, analisando o código, o que acontece é que como são dois actions listenner criados, também são criadas duas janelas. Um teste bem simples é você clicar no botão e mover o JDialog. Tah dah! Lá estara o outro Jdialog. Então, é só usar a dica do joao mesmo que resolve.