Testar se form está ativo

11 respostas
belmonte

olá!

  1. tenho um form PEDIDO q chama o form CLIENTE:
new ClienteTela().setVisible(true);
  1. qdo, no cliente, eu selecionar um registro (estou usando um jComboBox):
private void jComboBox1ActionPerformed(java.awt.event.ActionEvent evt)

quero q, qdo eu fechar esse form, apareça num jTextField do pedido o código do cliente.

  1. como faço para testar se o form PEDIDO está ativo qdo seleciono algo no jComboBox do form CLIENTE?

atenciosamente,

11 Respostas

peerless

Você pode encapsular o form Pedido dentro do form Cliente, assim você faz no Pedido, EX:

Cliente cform = new Cliente(); cform.setFormParaRetorno(this);

ai quando você quizer passar os dados, dentro do CLIENTE para o PEDIDO:

if (getFormParaRetorno() != null) getFormParaRetorno().setCodigoRetorno(meuCodigo.getText());

peerless

peerless:
Você pode encapsular o form Pedido dentro do form Cliente, assim você faz no Pedido, EX:

Cliente cform = new Cliente(); cform.setFormParaRetorno(this);

ai quando você quizer passar os dados, dentro do CLIENTE para o PEDIDO:

if (getFormParaRetorno() != null) getFormParaRetorno().setCodigoRetorno(meuCodigo.getText());

outra dica:
Utilize em modo MODAL, assim você garante que, o form “pai” não vai ser fechado antes do “filho”… o JDialog, tem um construtor específico para se fazer isso, no qual você passa o pai, e um booleano se quer ou não, que seja modal…

abçs

Grinvon

Uma alternativa a issso (pelo é assim que eu trabalho aqui), no construtor do form eu passo uma instância da classe que tem o método que eu quero que o form execute assim que for fechado. Dessa forma no evento de closed ou closing eu chamo o método da instância passada para o form. É muito simples e direto.

belmonte

Grinvon, não entendi, tem como passar um exemplo??

Grinvon

Exemplo:

Sua classe A deve executar uma rotina quando a classe B for fechada.

Nesse caso temos.

Classe A chame Classe B.

Classe B herda ou cria intância de JFrame (JDialog, JInternalFrame, o que seja.)

Em classe A

public void executarOperacaoDepoisDeB() {
//meu código aqui
}

.
.
.
ClasseB b = new ClasseB(this); //passa instância de A para B.
.
.
.

Em B temos:

private ClasseA a;

public ClasseB(ClasseA a) {
this.a = a;
.
.
.
}

public void internalFrameClosed(InternalFrameEvent e) {
    a.executarOperacaoDepoisDeB(); //chama método em A
}

Você pode implementar a javax.swing.event.InternalFrameListener.

Bom, essa é uma das formas de se fazer isso. Outra forma seria por thread.

peerless

Então. (como eu disse a mesma coisa) É a melhor forma.

Outra coisa, pense a nível de interfaces para ambos os casos, podendo promover um form digamos, “consultável” a uso de polimorfismo.

belmonte

Grinvon:
Exemplo:

Sua classe A deve executar uma rotina quando a classe B for fechada.

Nesse caso temos.

Classe A chame Classe B.

Classe B herda ou cria intância de JFrame (JDialog, JInternalFrame, o que seja.)

Em classe A

public void executarOperacaoDepoisDeB() {
//meu código aqui
}

.
.
.
ClasseB b = new ClasseB(this); //passa instância de A para B.
.
.
.

Em B temos:

private ClasseA a;

public ClasseB(ClasseA a) {
this.a = a;
.
.
.
}

public void internalFrameClosed(InternalFrameEvent e) {
    a.executarOperacaoDepoisDeB(); //chama método em A
}

Você pode implementar a javax.swing.event.InternalFrameListener.

Bom, essa é uma das formas de se fazer isso. Outra forma seria por thread.

seguinte:

ClienteTela.java

PedidoTela pTela = new PedidoTela();

public ClienteTela(PedidoTela pTela) {
   this.pTela = pTela;
}

private void formWindowClosed(java.awt.event.WindowEvent evt) {
   pTela.executarOperacaoDepoisDeCliente();
}

PedidoTela.java

ClienteTela cTela = new ClienteTela(this);

public void executarOperacaoDepoisDeCliente() {
   jTxtCodCliente1.setText(this.jTxtCodCliente2.getText());
   //sendo jTxtCodCliente1 da classe PedidoTela.java e jTxtCodCliente2 da classe ClienteTela.java
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
   new ClienteTela().setVisible(true);
}

não rolou, deu erro…

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError

o q estou fazendo errado?

peerless
belmonte:
Grinvon:
Exemplo:

Sua classe A deve executar uma rotina quando a classe B for fechada.

Nesse caso temos.

Classe A chame Classe B.

Classe B herda ou cria intância de JFrame (JDialog, JInternalFrame, o que seja.)

Em classe A

public void executarOperacaoDepoisDeB() {
//meu código aqui
}

.
.
.
ClasseB b = new ClasseB(this); //passa instância de A para B.
.
.
.

Em B temos:

private ClasseA a;

public ClasseB(ClasseA a) {
this.a = a;
.
.
.
}

public void internalFrameClosed(InternalFrameEvent e) {
    a.executarOperacaoDepoisDeB(); //chama método em A
}

Você pode implementar a javax.swing.event.InternalFrameListener.

Bom, essa é uma das formas de se fazer isso. Outra forma seria por thread.

seguinte:

ClienteTela.java
PedidoTela pTela = new PedidoTela();

public ClienteTela(PedidoTela pTela) {
   this.pTela = pTela;
}

private void formWindowClosed(java.awt.event.WindowEvent evt) {
   pTela.executarOperacaoDepoisDeCliente();
}
PedidoTela.java
ClienteTela cTela = new ClienteTela(this);

public void executarOperacaoDepoisDeCliente() {
   jTxtCodCliente1.setText(this.jTxtCodCliente2.getText());
   //sendo jTxtCodCliente1 da classe PedidoTela.java e jTxtCodCliente2 da classe ClienteTela.java
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
   new ClienteTela().setVisible(true);
}
não rolou, deu erro...
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError

o q estou fazendo errado?

Amigão, se tu me ignorar mais uma vez não respondo mais este tópico! :roll:

Veja bem, você precisa fazer uma classe "enxergar" a outra.

Problema: Ao abrir a consulta, e a mesma ser efetuada, pegar o código em questão e enviar ao formulário pedinte.

Vamos fazer assim, a classe A é o seu pedido, e a B é a classe de consulta.

Em tese, precisamos fazer com que a classe A, crie uma nova instancia da classe B, enviando para esta instancia a sua própria instancia (de A), para que, a classe B, encapsule A, e saiba que deve enviar o seu retorno para ela, quando ela for fechada.

Consideramos o código a nível de interfaces:

public interface Receptor {
  void setResult(Object result);
  Object getResult();
  void notifyWork();
}
public interface Emissor {
  void setReceptor(Receptor owner);
}
public class A implements Receptor extends JFrame.. {
   //pode usar generics 
   private Object result;
   
   public void notifyWork() {
        txtCodigo.setText(((String)getResult());
   }
   public void setResult(Object result) {
         this.result = result;
   }
   public Object getResult() {
         return result;
   }

   método_que_abre_a_consulta {
       B consulta = new B();
       B.setReceptor(this); //veja que vc está mandando uma instancia de A para B
       B.setVisible(true);
   }
}
public class B implements Emissor ... {
    private Receptor receptor;
    public void setReceptor(Receptor receptor) {
         this.receptor = receptor;
    }

   metodo_que_executa_pesquisa {
   
    //fim da pesquisa
    getReceptor().setResult(txtCodigo.getText());
    getReceptor().notifyWork();
    //fecha a pesquisa
    this.dispose(); 
    this.setVisible(false);
   }
}

Dê uma olhada no JDialog e veja seu construtor modal.. também pode ser útil!

belmonte

peerless, deu certo! Obrigado guri!!
só tá dando um problema ainda…

como estou utilizando o método formWindowClosed, qdo chamo o form CLIENTE direto, sem ser por intermédio do form PEDIDO, ele deixa o java executando em background.
[color=red]como faço para testar se a chamada veio do form PRINCIPAL (não precisando executar o método formWindowClosed) ou se a chamada veio do form PEDIDO (devendo executar o método formWindowClosed)?[/color]

private void formWindowClosed(java.awt.event.WindowEvent evt) { getReceptor().setResult(jTextField1.getText()); getReceptor().notifyWork(); this.dispose(); this.setVisible(false); }
abraço e obrigado mais uma vez! :smiley:

diego2005

Verifique se o Receptor é null:

private void formWindowClosed(java.awt.event.WindowEvent evt) { if (getReceptor() != null) { getReceptor().setResult(jTextField1.getText()); getReceptor().notifyWork(); } this.dispose(); this.setVisible(false); }

T+

belmonte

diego2005:
Verifique se o Receptor é null:

private void formWindowClosed(java.awt.event.WindowEvent evt) { if (getReceptor() != null) { getReceptor().setResult(jTextField1.getText()); getReceptor().notifyWork(); } this.dispose(); this.setVisible(false); }

T+

valeu guri!
a única coisa q precisei fazer foi trocar o local do código. Tirei do método formWindowClosed e coloquei no formWindowClosing, pois estava em looping. Não sei o motivo.
abraço! :smiley:

Criado 8 de fevereiro de 2008
Ultima resposta 9 de fev. de 2008
Respostas 11
Participantes 4