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.