Nova instancia ou setVisible para Janela?

16 respostas
dooda

Olá pessoALL…

iniciando minhas pesquisas sobre o Swing, qual a maneira correta de iniciar/mostrar/instanciar as janelas considerando a seguinte estrutura:

minhaApp.java: possui somente o metodo main que chama o menu
meuMenu.java: possui alguns jMenuItens com seu actionsListener’s
meuCad.java: possui alguns jTextFields pra teste e um jButton fechar

no Main da minhaApp usei:

meuMenu menu = new meuMenu();
menu.setVisible(true);

no ActionListner do menu usei:

if (meuCad==null){meuCad = new meuCad();};
meuCad.setVisible(true);

e no JButton fechar do meuCad usei:

this.setVisible(false);

É correto? qual a maneira correta de manipular uma aplicação’zinha com um menu principal e suas janelas?

Obrigado desde já!!!

16 Respostas

keller

Ola,

Voce deve usar o metodo dispose();
Caso for um JInternalFrame deve ser usado o doDefaultCloseAction();

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JInternalFrame.html

Espero que ajude. :thumbup:

lina

Oi,
só não sei o que o dispose() tem haver com isso, pois a pergunta abordada é sobre abrir uma janela…

Então… seu setVisible(true) esta correto sim…
existem varias maneiras de abrilas e acredito que não faz diferença…

do tipo: show, setVisible, frame.show()… entre outras…

mas acredito que não implica diferença nenhuma…

acho que o keller quis dizer, é que existem tambem ‘n’ formas de fechar uma janela ou aplicações e que o correto depois de abrir cada “janelinha” você deve fecha-las dando um dispose() e não um System.exit(0); pois o system faz com que sua aplicação feche por inteiro… e não sómente a janela atual.

Tchauzin!

dooda

GUJ é demais!!! :smiley:

Obrigado Lina e Keller, na verdade eram as as duas duvidas que eu tinha mesmo, como criar e como fechá-las…

Eu estava mesmo usando o System.exit(0); :shock:
e com o dispose(); funcionou da maneira esperada…

outra pequena duvida é que, quando crio ou seto visible para este frame, ele “cria” como se fosse uma nova na barra de tarefas do SO, é normal?

Algo que me preocupa (:oops: programo em delphi :oops: ) é que se uma aplicação tenha muitas janelas, como isso vai ficando na memória?
O garbage dá um jeito sozinho?

lina

Oi,
Então… você esta fazendo um programas com Menu… e quando você abre uma função do menu (tela) você deve estar chamando um JDialog ou um JFrame né?! o correto seria trabalhar com o JInternalFrame… sendo assim, o mesmo ficara dentro de sua aplicação principal e não sairá dali… e portanto, não vai ficar abrindo “caixas” na barra de tarefas…

hehe eu espero né =)

E tipo, para usar um JInternalFrame você deve trabalhar também com o JDesktopPane… de uma procurada melhor sobre isso! deve ter varios tópicos referentes a como usa-lo…

qualquer duvida, da um grito xD

Tchauzin!

keller

Ola,

Como a Lina ja falou de uma procurada sobre JDesktopPane e JInternalFrame. Esses componentes vao solucionar esse seu problema.

Se voce utilizar os metodos corretos para “fechar” a janela e nao simplesmente esconder voce nao precisa se preocupar com isso…

Boa sorte. :thumbup:

RaulCarlin

Na verdade, depois do Java 5 e agora com as melhorias do Java 6 o Swing está muito melhor tanto em relação à performance quanto à memória.

Pra quem programa muito em Swing e muitas vezes não usa thread, deve lembrar que quando a tela esperava o processamento de um método (tipo query no banco) que demora muito, ela não ficava renderizada caso uma outra janela ficasse por cima dela, ficava tudo cinza, com o desenho do desktop, coisas bem toscas. Hoje no 6 já tem um buffer muito bom, você pode até mudar o tamanho dela que ela fica renderizada bunitinha como no ultimo estado antes do método…

Pra mim hoje em dia Java não deve nada em relação à GUI desktop…

keller

Sim em questao de performance e interacao com o SO o Java 6 esta legal.

Isso pra min ja estava “resolvido” rodar o processo em uma thread e colocar uma JDialog(undecorated) na frente dizendo aguarde resolvia o problema…

Realmente voce pode ate desconsiderar a resposta anterior caso JRE6.

Continua sendo um pe no sa** trabalhar com Editors e Renderers pra fazer componentes em celulas das Tables e criando TableModel pra trabalhar com Pojos via reflexao (ok flexibilidade tem seu preco). Fora isso nao ha do que reclamar mesmo.

Houve mudancas na JavaCommAPI ? :roll:

Ate mais… :thumbup:

dooda

Total, total total!! :smiley:

Vallew pessoal, é muito importante a ajuda de vocês… a cada resposta procuro ler mais sobre o que está sendo discutido…

mais o paradigma estruturado muito me persegue… :wink:

Obrigado…

ViniGodoy

É sempre o bom e velho trade off de memória vs. processamento.

Se você quiser deixar sua GUI rápida, e está disposto a sacrificar memória para isso, crie as janelas uma única vez e depois use apenas o setVisible(true) e setVisible(false). A janela invisível ocupa memória, mas torna-la visivel novamente é uma operação praticamente instantanea. Ela também mantém todos os dados digitados pelo usuário o que pode ou não ser uma vantagem, dependendo de como você estruturou suas telas.

Agora, se você tem pouca memória, ou suas janelas não pesam tanto assim, use o método dispose() e crie novas janelas com o new. Isso liberará a memória quase imediatamente, mas existe a necessidade de processar a sua criação toda vez que a janela for aberta. É a única opção válida também caso você queira abrir várias instâncias da mesma janela (ok, daria para fazer um pool de janelas e controlar o visible ou não, mas seria muita complexidade para pouco resultado).

ViniGodoy

Sim, aparentemente o suporte ao Windows foi silenciosamente abandonado…

keller

ViniGodoy:

Sim, aparentemente o suporte ao Windows foi silenciosamente abandonado…

Otimo agora tenho que escrever um “mini-sistema” e acessa-lo via JNI pra comunicar com as COMs no windows, ate ai tudo bem…
E depois pra reescrever pra *unix nao fica complicado? Alguem ja teve algum tipo de experiencia e pode dizer algo? O mesmo .so vale pra todos os *unix-like ?

dooda

Só mais uma dúvida grandes GujUser’s…

eu tenho, FrmModelo (abstract extend JFrame) e FrmCadastro (extend FrmModelo)…

no botao fechar do FrmCadastro estou usando o dipose(); ele ate está fechando a janela, mas quando chamo o cadastro novamente desta maneira:

if (cadTexto==null){ cadTexto = new fcdTexto(); }; cadTexto.setVisible(true);

ele sempre “ignora” a criação, setando visible e mostrando os dados digitados anteriormente nos JTextFields por exemplo…

Está correto?

(ps.: O FrmModelo tem setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE):wink:

Brigadu!!!

lina

Oi,
desculpa amigo, não entendi bem sua pergunta…
que tal colocar seu código?

assim, antes de postar códigos… coloque eles entre as barras:

Tchauzin!

keller

Sim, afinal a variavel “cadTexto”(que e um form) nao esta null.
Sendo ela uma variavel de instancia sempre guardara os valores nela. :wink:

Pelo menos ate o seu FrmCadastro ser fechado. :wink:
Boa sorte! :thumbup:

dooda

Lina:
que tal colocar seu código?

assim, antes de postar códigos… coloque eles entre as barras:

Tchauzin!

Desculpe-me Lina, já arrumei e não irá se repetir… :oops:

keller:

Sim, afinal a variavel “cadTexto”(que e um form) nao esta null.
Sendo ela uma variavel de instancia sempre guardara os valores nela. :wink:

Pelo menos ate o seu FrmCadastro ser fechado. :wink:
Boa sorte! :thumbup:

Compreendi Keller, obrigado novamente… :smiley:

ViniGodoy

[DELETADO]

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