Fechar janela modal (criada numa JDialog) através de um botão referenciando um método estrangeiro

6 respostas
diegobilhalva

Prezados amigos,

Sou novo tanto no fórum quanto na linguagem Java.

Após pesquisar por alguns dias não consegui uma resposta efetiva ao meu problema.

Tenho 3 classes.

A Classe frmInicio.java, é um form do tipo Main e após clicar num item do seu menu, ele abre outro form, adaptado à 1 JDialog cuja a propriedade setContentPane é alimentada pela classe frmEstudo.java que possui alguns componentes, entre eles o botão Fechar. Tanto o frmInicio.java e frmEstudo.java tem em suas referências a classe MyWindow.java, onde eu tenho métodos como void windowClosing, ou seja, quando o usuário clicar no X da janela (padrão windows para fechar um form qualquer) ele encerra ora com o System.exit(0) ora com o window.dispose().

Bom vamos ao problema: (Dado ao conhecimento super básico que tenho...)
1) Não consigo fazer um botão chamar o método windowClosing da classe estrangeira passando os argumentos necessários (WindowEvent e). Seria possível eu fazer isto?
2) Se "não" para a questão 1, eu criei um outro método nesta classe estrangeira do tipo void (public void btnFechar(Window window)) onde eu passo o "window" que quero fechar (neste caso frmEstudo). Acontece que para System.exit(0) funciona, só que acaba com toda a aplicação, e com o window.dispose() não acontece nada.

Alguém pode me ajudar?

Abaixo trechos do meu código... Classe frmInicio.java quando cria o form frmEstudo:
this.newFileMenuItem.addActionListener(new ActionListener() {  //ao clicar no menu...
					@Override
					public void actionPerformed(ActionEvent e) {
						// TODO Auto-generated method stub
						JDialog viewer = new JDialog(new javax.swing.JFrame(),"Visualização Modal", true); //cria uma JDialog chamada viewer
						frmEstudo Estudo = new frmEstudo(); //instancia a classe frmEstudo.java passando para a variável Estudo
						Estudo.setName("frmEstudo");
						viewer.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
						viewer.addWindowListener(new MyWindow(false)); //(OBS.: o valor 'false' alimenta o parâmetro construtor booFecha. Mais abaixo o significado)
						viewer.setName("frmEstudo");
						viewer.setContentPane(Estudo.getContentPane()); //atribui form ao JDialog
						viewer.setSize(200, 160);
						viewer.setLocationRelativeTo(Estudo);
						viewer.setResizable(false);
						viewer.setVisible(true); //exibe o form
					}
				});
Classe frmEstudo.java quando clico no botão fechar:
this.jBtnFechar.addActionListener(new ActionListener() {
				
				@Override
				public void actionPerformed(ActionEvent e) {
					// TODO Auto-generated method stub
					MyWindow form = new MyWindow(false); //instancia da classe estrangeira MyWindow (OBS.: o valor 'false' alimenta o parâmetro construtor booFecha. Mais abaixo o significado)
					Window window = new Window(getOwner()); //a intenção é passar o objeto à classe estrangeira MyWindow
					window.setName(getName());
					form.btnFechar(window); //chama método estrangeiro btnFechar
				}
			});
Classe MyWindow.java - Método windowClosing (funcionando para o "X" padrão windows) - OK
public void windowClosing(WindowEvent e) {
		// TODO Auto-generated method stub
		Window window = ((Window)e.getSource());  
		int result = JOptionPane.showConfirmDialog(  
						window,   
						"Realmente fechar?",   
						"Fechar?",   
						JOptionPane.YES_NO_OPTION);  
		if (result == JOptionPane.YES_OPTION) {
			if(booFecha){
				System.exit(0);
			}else{
				window.dispose();
			}
		} 
	}
Classe MyWindow.java - método btnFechar - PROBLEMA
public void btnFechar(Window window){
		int result = JOptionPane.showConfirmDialog(  
						window,   
						"Realmente fechar?",   
						"Fechar?",   
						JOptionPane.YES_NO_OPTION);  
		if (result == JOptionPane.YES_OPTION) {
			if(booFecha){
				System.exit(0);
			}else{
				window.dispose();//QUANDO booFecha É FALSO (O CASO EM QUESTÃO), ou seja, quando eu quero q apenas feche a janela, sem "matar" a aplicação. Infelizmente nada acontece.
			}
		}
	}

Espero que tenha sabido expressar claramente o problema, e desde já, grato pela ajuda e felicidades à todos.

6 Respostas

lina

Oi,

Acho que você está confundindo os conceitos ou então pensando em maneira muito complicada de resolver essa situação.

Ainda não entendi o porque foi criado a classe MyWindow.java… Apenar para controlar a função close das janelas?

Tchauzin!

diegobilhalva

Oi Lina,

Obrigado pelo interesse.

A classe MyWindow é um teste. O objetivo (futuro) é criar um f.work similar ao que já desenvolvi em python.
Sim, esta classe seria uma controladora, a grosso modo, do estado das GUIs de uma possível aplicação. Tudo, absolutamente tudo, relacionado à forms seria controlada por uma classe similar a MyWindow.

Você recomendaria diferente?

Obrigado.

lina

Oi,

Só acho que não precisaria ter essa MyWindow.java

Na janela principal utilizaria o System.exit(0) e na janela secundaria simplesmente um dispose();

E retiraria o setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); por setDefaultCloseOperation(DISPOSE_ON_CLOSE);

Tchauzin!

diegobilhalva

Pois é, acontece que seria uma condição sine qua non neste projeto ter esta classe. Óbviamente terei de “abandonar” a idéia se não for possível por esta linguagem.

Mas obrigado pelas dicas! :thumbup:

abraços

ViniGodoy

Acho que você está misturando as coisas. Em primeiro lugar, não existe “classe estrangeira”.
OO != banco de dados

Depois, pela forma que você falou dos seus métodos, está cheirando que você está misturando programação estruturada com OO, o que indica uma má idéia. Você por acaso programava em alguma outra linguagem antes do Java?

P

lina:
Oi,

Só acho que não precisaria ter essa MyWindow.java

Na janela principal utilizaria o System.exit(0) e na janela secundaria simplesmente um dispose();

E retiraria o setDefaultCloseOperation(DO_NOTHING_ON_CLOSE); por setDefaultCloseOperation(DISPOSE_ON_CLOSE);

Tchauzin!

Obrigado Lina, usei o comando dispose no tratamento de um botao para fechar minha segunda janela, e funcionou perfeitamente. :smiley:

Criado 15 de junho de 2010
Ultima resposta 16 de jun. de 2011
Respostas 6
Participantes 4