Como ter apenas uma instancia em varias telas?[RESOLVIDO]

8 respostas
R

Pessoal, meu programa tem 2 telas…
a primeira principal que é um JDialoge uma segunda que é um JDialogtambem…
a segunda tela é uma tela que contem um JList que contem o nome de arquvos anexados (escolhidos atraves do JFileChooser)… ate ai tudo bem, meu programa roda normal…
criei uma variavel singleton na tela principal, de forma que a segunda tela passe para a primeira tela o arquivo anexado…
quando o usuario clica em fechar na segunda tela(coloquei um evento actionPerformed no botao FECHAR seguido da instrução dispose():wink:

ai se ainda na mesma tela o usuario entrar de novo na tela de anexos, a tela esta vazia(claro, eu chamo a tela pela instrução )

onde ele cria uma nova instancia da classe…
entao minha pergunta é… como chamar a segunda tela varias vezes e ele continua do jeito que estava antes de ser fechada???

ps.: tentei criar, na segunda tela, a variavel estatica singleton pela instrução

public static AttachmentGUI getInstance() { if (singleton == null) { singleton = new AttachmentGUI(); } return singleton; }
e na tela principal ao inves de eu chamar a tela pelo new AttachmentGUI() eu tava usando AttachmentGUI.getInstance();
porem ele abre a primeira vez normal, porem ao fechar e tentar abrir, nada acontece…nem da mensagem de erro nem abre nada…
alguem sabe como devo proceder???

aproveitando o embalo, pq meu JDialog nao mostra nem botao minimizar nem aparece na barra de tarefas do windows???

8 Respostas

R

ngm help? :’(

keller

Ola,

O forum funciona na base da boa vontade.

A um problema na arquitetura do seu sistema pois a 1a tela deveria ser um JFrame e a 2a um JDialog.

Voce nao criou uma variavel Singleton voce usou esse pattern(padrao) pra resolver esse seu problema.

Nao estou vendo a necessidade de ele ser um singleton neste caso, pode me explicar porque da escolha do pattern e qual o problema que estava ocorrendo para optar por ele ?

Ate mais. :wink:

J

keller:
Ola,

O forum funciona na base da boa vontade.

A um problema na arquitetura do seu sistema pois a 1a tela deveria ser um JFrame e a 2a um JDialog.

Voce nao criou uma variavel Singleton voce usou esse pattern(padrao) pra resolver esse seu problema.

Nao estou vendo a necessidade de ele ser um singleton neste caso, pode me explicar porque da escolha do pattern e qual o problema que estava ocorrendo para optar por ele ?

Ate mais. :wink:


bom, vamos por parte…
creio eu… pelo menos eu penso que nao… o fato da primeira tela ser JDialog ao invez de JFrame, nao influe no meu problema…
usei o Pattern singleton para ter acesso aos metdos de tela01 a tela 02 e da tela02 a tela01…por exemplo…o arquivo anexado na tela02, tem que ser passado para a tela01 para qdo o botao ENVIAR ser pressionado, ele enviar o anexo…eu criando apenas um metodo public na tela 01… e instanciando a tela01 dentro da tela02(para poder acessar o metodo de tela01), meu programa ia ficar abrindo varias tela01… entao usando o singleton, eu garanto que isso nao acontece…

qdo eu abro o botao anexo, o comando new é feito a tela 02 abre normal… qdo eu fecho, o anexo vem para tela01normal… porem se eu retornar a apertar no botao anexo, ele abre uma nova instancia da tela02 e o JDialog que deveria mostrar com os anexos anteriores, aparece vazio(como disse, normal, afinalé uma nova instancia)…
entao o que eu queria era abrir apenas uma instancia da tela02(ao abrri a primeira vez ele cria e nao cria mais… sempre que eu clica em anexo, ele chama o ja entao criado tela02)
entao queria saber como eu poderia fazer isso??
ta certo em chaamr a tela 02 por new Tela02(); dentro da tela01???
ta certo eu fechar a tela 02 com o comando dispose(); ???
caso positivo, entao o que deve ser feito para contornar meu problema??
caso negativo, quais comando de chamada de tela02 ou encerramento da mesma, de forma que toda vez que eu entrar na tela02 sempre mostre o conteudo da mesma…

nao sei se esclareceu ou dificultou mais ainda… mas qualquer coisa é só falar
agradeço a ajuda de todos. :slight_smile:

keller

Porque e um JDialog. Faca um teste com JFrame. :wink:

Voce poderia passar o objeto tela01 para o tela02 e no tela02 invocar o metodo da tela01, quando fechar a tela02 setar o tela02 no tela01.

Sim, mas voce tambem poderia usar um Container IoC+DI pra fazer isso. ( mas fica como dever de casa… ) [ dica: PicoContainer ]

Sim se tela02 for JDialog.

Ja respondi… :wink:

De nada. :wink:

J

keller:
JavaBasic:

creio eu… pelo menos eu penso que nao… o fato da primeira tela ser JDialog ao invez de JFrame, nao influe no meu problema…

Porque e um JDialog. Faca um teste com JFrame. :wink:

Voce poderia passar o objeto tela01 para o tela02 e no tela02 invocar o metodo da tela01, quando fechar a tela02 setar o tela02 no tela01.

Sim, mas voce tambem poderia usar um Container IoC+DI pra fazer isso. ( mas fica como dever de casa… ) [ dica: PicoContainer ]

Sim se tela02 for JDialog.

Ja respondi… :wink:

De nada. :wink:


bom keller, vamos la…

Voce poderia passar o objeto tela01 para o tela02 e no tela02 invocar o metodo da tela01, quando fechar a tela02 setar o tela02 no tela01. isso seria pra resolver o problema de eu passar os dados de tela02 para tela 01?? isso ja resolvi usando o singleton(embora pelo que vc disse nao devia ter sido usado, embora nao tenha entendido o pq)…
o que eu ainda nao entendi(se vc ja explicou, desculpa :oops:) é como nao perder minha primeira instancia de tela02 ja criada(ou é impossivel e toda vez que eu chamar tela02 eu tenho que setar novamente minha JList nessa ida e volta de dados???)

Sim, mas voce tambem poderia usar um Container IoC+DI pra fazer isso. ( mas fica como dever de casa… ) [ dica: PicoContainer ]
o que seria esse container IoC+DI??? poderia dizer o nome dele e o que isso faz exatamente??? procuro na net por esse nome IoC+DI mesmo???

no mais, agradeço novamente… :smiley:

keller

Ok vamos com codigos quem sabe fica mais visivel a solucao:

//class Tela01
private Tela02 tela02; //get & set
Tela01 tela01 = new Tela01();
...
private void buttonTela01Action(ActionEvent ev){
    if(this.tela02 == null){
        this.tela02 = new Tela02();
    }
    this.tela02.setTela01(this);
    this.tela02.setVisible(true);
}
//class Tela02
private Tela01 tela01; //get & set
...
private void buttonTela02Action(ActionEvent ev){
    this.tela01.setTela02(this);
    this.dispose();
}

Leu a dica? PicoContainer, tem um tutorial no GUJ e uma abordagem que pode ser utilizada com MVC.
Caso interesse de uma olhada no binding de dados do Genesis que tambem e muito bom.

Hoje o projeto aqui conta com esses frameworks:
Genesis ( binding )
JGoodies ( validation )
PicoContainer ( ioc+di )
Commons-Logging ( log api )
SwingLabs ( components )

Mas ai e questao de necessidade e escolha… :wink:
Boa sorte! :thumbup:

R

keller:
JavaBasic:

Isso seria pra resolver o problema de eu passar os dados de tela02 para tela 01?? isso ja resolvi usando o singleton(embora pelo que vc disse nao devia ter sido usado, embora nao tenha entendido o pq)…
o que eu ainda nao entendi(se vc ja explicou, desculpa :oops:) é como nao perder minha primeira instancia de tela02 ja criada(ou é impossivel e toda vez que eu chamar tela02 eu tenho que setar novamente minha JList nessa ida e volta de dados???)

Ok vamos com codigos quem sabe fica mais visivel a solucao:

//class Tela01
private Tela02 tela02; //get & set
Tela01 tela01 = new Tela01();
...
private void buttonTela01Action(ActionEvent ev){
    if(this.tela02 == null){
        this.tela02 = new Tela02();
    }
    this.tela02.setTela01(this);
    this.tela02.setVisible(true);
}
//class Tela02
private Tela01 tela01; //get & set
...
private void buttonTela02Action(ActionEvent ev){
    this.tela01.setTela02(this);
    this.dispose();
}

Leu a dica? PicoContainer, tem um tutorial no GUJ e uma abordagem que pode ser utilizada com MVC.
Caso interesse de uma olhada no binding de dados do Genesis que tambem e muito bom.

Hoje o projeto aqui conta com esses frameworks:
Genesis ( binding )
JGoodies ( validation )
PicoContainer ( ioc+di )
Commons-Logging ( log api )
SwingLabs ( components )

Mas ai e questao de necessidade e escolha… :wink:
Boa sorte! :thumbup:


vlw keller, funcionou normal agora :D:D:D:D
a diferença era que qdo eu iniciava a primeira vez a tela02, ao fechar, ele reabria de novo…eu resolvi esse problema colocando um else apos o if ficando

private void buttonTela01Action(ActionEvent ev){ if(this.tela02 == null){ this.tela02 = new Tela02(); } else this.tela02.setVisible(true); }
e funcionou perfeito :smiley:
essa parte this.tela02.setTela01(this); eu nao coloquei pq eu nao sei o que seria esse setTela01(this)… eu uso o eclipse e o visual editor dele, ai ele gera os codigos diferentes(o VE do eclipse)… mas mesmo sem o this.tela02.setTela01(this); ta funcionando perfeito…
vlw :smiley:

quanto ao IoC vou da uma olhada sim.

keller

De uma olhada nos frameworks que eu citei eles ajudam bastante na construcao de uma aplicacao desktop.

Boa sorte! :thumbup:

Criado 4 de julho de 2007
Ultima resposta 5 de jul. de 2007
Respostas 8
Participantes 3