[RESOLVIDO] JInternalFrame

Bom dia pessoal, gostaria de tirar uma duvida.
Estou começando a mudar minha aplicação para JInternalFrame, é uma boa ideia?

Outra coisa, minha intenção não é abrir um monte de internalframe dentro do principal, minha intenção é abrir apenas um e qdo abrir o outro fechar o anterior e assim por diante.

Exemplo:

Eu tenho a tela principal que tem um menubar.

Supondo que eu cliquei na classe ‘cadastrar’, vai abrir a classe cadastrar, ai eu clico para abrir o ‘excluir’. a classe excluir vai sobrepor a classe cadastrar, isso ocuparia mais memoria? valeria a pena eu usar “dispose()” para fechar o frame que estava aberto? Caso sim, Como eu identificaria qual o frame estar aberto para poder fechar?

Só pra deixar claro, se fosse apenas 2 classe eu poderia fazer um simples if, mas tendo mais de 10 classes ficaria um tanto qto “ridiculo” fazer varios if’s para identificar qual está aberto.

Obrigado, espero que possam responder e entender minhas duvidas.

uma forma de resolver seu nproblema é com o CardLayout.

sds

j.silvestre

Boa noite a todos.

[quote=j.silvestre]uma forma de resolver seu nproblema é com o CardLayout.

sds

j.silvestre[/quote]

Nem tanto, pois se o seu problema é economizar memória e não só poluir a tela, o CardLayout seria o menos indicado, pois este layout carrega todas as telas de uma única só vez em memória, sendo que voce só visualizaria uma única tela por vez, sendo então indicado apenas no que tange a visualização da tela.

Os JInternalFrames são utilizados no que chamamos Aplicação MDI (Multiple Documents Interface ou Interface de Documentos Múltiplos), e este tipo de aplicação se encaixa em quem precisa visualizar mais de uma tela ao mesmo tempo. Exemplos: O usuário precisa visualizar a tela de um Cliente e consultar a tela de produtos, para que possa efetuar uma venda.

Pelo visto, já que este não é o seu caso, então utilize o sistema SDI (Multiple Documents Interface ou Interface de Documentos Simples), e uma forma de voce abrir um formulário sem permitir que se abra outro, é usar JDialogs ao invés de JFrames, pois JDialogs com a opção Modal = true, só permitirá voce clicar fora dele quando este for fechado.

Agora, se voce não tem problema com memória, então voce pode utilizar a dica do J.Silvestre, muito embora ela vá carregar todos os panels do CardLayout na memória.

Obrigado pelas respostas.

Entao, minha ideia é de abrir uma tela mesmo, mas usar o jdialog abriria um outro frame (digamos assim), e ja que voce falou que o cardlayout carregaria tudo d uma vez, talvez nao fosse mto bom, pq são mais de 9 telas diferentes.

A minha intenção ao abrir um unico frame seria deixar ele “parado” na barra do iniciar e nao fechando um e aparecendo outro todoa hora que eu mudasse de classe.
Eu fiz um teste com 2 jinternalframe e conseguiria identificar qual tá aberto e fechar o outro, mas com mtas classes teria que fazer mtos if’s…

E usando jdialog minha classe que tem o menubar ficaria meio “sem função” neh? até pq as outras jdialog também teria um menu bar.
pq minha intenção era que o usuario nao precisasse voltar pra tela principal para ir para outra tela.
Como voce acha que eu poderia fazer?

Obrigado.

[quote=tarlix]Obrigado pelas respostas.

Entao, minha ideia é de abrir uma tela mesmo, mas usar o jdialog abriria um outro frame (digamos assim), e ja que voce falou que o cardlayout carregaria tudo d uma vez, talvez nao fosse mto bom, pq são mais de 9 telas diferentes.

A minha intenção ao abrir um unico frame seria deixar ele “parado” na barra do iniciar e nao fechando um e aparecendo outro todoa hora que eu mudasse de classe.
Eu fiz um teste com 2 jinternalframe e conseguiria identificar qual tá aberto e fechar o outro, mas com mtas classes teria que fazer mtos if’s…

E usando jdialog minha classe que tem o menubar ficaria meio “sem função” neh? até pq as outras jdialog também teria um menu bar.
pq minha intenção era que o usuario nao precisasse voltar pra tela principal para ir para outra tela.
Como voce acha que eu poderia fazer?

Obrigado.[/quote]

Cara, um dica é:
Crie uma tela Principal com um menu acima, por exemplo, abra as telas com JInternalFrame, e, utilize JFrames, para abrir outras telas em caso de Telas de pesquisa…

Entao cara, eu queria usar jinternalframe, mas como disse no primeiro post, o problema é que quando eu abrir um novo jinternalframe ele feche o que estava aberto anteriormente, isso que nao sei como fazer, pq nao saberia identificar qual jinternalframe estava aberto antes, entendeu?

valeu.

Fala Tarlix, beleza?

Então cara, é simples…

Tipo, você vai criar seu JFrame que vai ser o principal, certo? com o menu e tal…

Entao, você irá declarar todas as JInternalFrame dentro deste JFrame, certo?

Então, você só precisa fazer um método que, verifique se algum JInternalFrame está aberta com “isVisible()”

Segue um exemplo…

public class JFPrincipal extends javax.swing.JFrame {

    private void menuFluxoCaixaActionPerformed(java.awt.event.ActionEvent evt) {                                               
        if(jFFluxoCaixa==null){
            jFFluxoCaixa = new JFFluxoCaixa();
        }
        jPPrincipal.add(jFFluxoCaixa);
        jFFluxoCaixa.setVisible(true);
    } 


    private JFFluxoCaixa jFFluxoCaixa;

}

Entendeu?
Qualquer coisa só falar!

Abs

Bom dia,blz?
Cara eh o seguinte, desse jeito que você mostrou no exemplo, vc esta verificando se o jinternal esta nulo e caso contrário você instancia eno torna visível, ótimo, mas supondo que eu abrisse outro jinternal… Esse que eu abri anteriormente continuaria aberto, r
Tendo em vista que eu nao usaria dois frames de uma vez, eu gostaria de fechar o que foi aberto anteriormente. O problema eh que usando varias classes fazer a verificação ficaria um pouco grande demais…
No jinternalframe tem algum método que eu verifico se tem um frame aberto e caso tenha fechar?

Bom dia!

Então cara, justamente por isto você cria um metodo, tipo “verificaFrames()”, chamado quando for requisitado abrir uma nova tela, verificando se tem alguma das telas que não esteja null e, fazendo o método “isVisible”, que retorna um boolean, caso haja alguma com visible = true, você o muda para false, e abre a nova tela…

Entendeu?

Abs

Vou dar um exemplo:

    public class JFPrincipal extends javax.swing.JFrame {  
      

        private void verificaTelas(){
            if(jFEstoque!=null && jFEstoque.isVisible()){
                jFEstoque.setVisible(false);
            }

            if(jFFluxoCaixa!=null && jFFluxoCaixa.isVisible()){
                jFFluxoCaixa.setVisible(false);
            }
        }


        private void menuFluxoCaixaActionPerformed(java.awt.event.ActionEvent evt) {                                                 
            if(jFFluxoCaixa==null){  
                jFFluxoCaixa = new JFFluxoCaixa();  
            }  
            verificaTelas();
            jPPrincipal.add(jFFluxoCaixa);  
            jFFluxoCaixa.setVisible(true);  
        }   



        private void menuEstoqueActionPerformed(java.awt.event.ActionEvent evt) {                                                 
            if(jFEstoque==null){  
                jFEstoque= new JFEstoque();  
            }  
            verificaTelas();
            jPPrincipal.add(jFEstoque);  
            jFFluxoCaixa.setVisible(true);  
        }   
      
      
        private JFFluxoCaixa jFFluxoCaixa;  
        private JFEstoque jFEstoque;  
      
    }  

Algo assim…

Abs

entendi. bom, soh poderei testar amanha, entao amanha eu falo se consegui.

Valeu, obrigado pela atenção.

Beleza tarlix, se conseguir ou não, posta ai depois…

Qlqr coisa estamos ai

Abs

Boa tarde a todos.

A dica do nosso amigo Leonhard32 está quase boa, e digo isto que faltou só um pequeno detalhe, pois com a dica dele voltamos ao mesmo problema da ocupação de memória.

Outra coisa que reparei é que não vi nenhum JDesktopPane declarado, pois JInternalFrames funcionam melhor com JDesktopPane que é um Panel container de JInternalFrames, ou seja, uma janela para JInternalFrames. Portanto declare um JDesktopPane no JFrame principal desta forma:


public class JFPrincipal extends JFrame {
    ....
    private JDesktopPane mainpanel;

    public JFPrincipal(){
           ......
           mainpanel = new JDesktopPane();
           setContentPane(mainpanel);
           ....
    }
    .....
}

Se a sua lógica é quando chamar um Frame, instânciá-lo na hora, e quando abrir outro e fechar o frame atual e retirá-lo da memória, ou seja, voce queira que só um Frame esteje em memória por vez, no momento em que o usa então vejamos:

public class JFPrincipal extends javax.swing.JFrame {    
    
  
    private void verificaTelas(){  
        if(jFEstoque!=null && jFEstoque.isVisible()){
            jFEstoque.setVisible(false);  // Este método coloca o frame invisível porém não o retira da memória.
            mainpanel.remove(JFEstorque);
            JFEstoque.dispose();
            JFEstoque = null;
        }  
  
        if(jFFluxoCaixa!=null && jFFluxoCaixa.isVisible()){  
            jFFluxoCaixa.setVisible(false);
            mainpanel.remove(JFFluxoCaixa);
            JFFluxoCaixa.dispose();
            JFFluxoCaixa = null; 
        }  
    }  
  
  
    private void menuFluxoCaixaActionPerformed(java.awt.event.ActionEvent evt) {
        verificaTelas();                                                     
        if(jFFluxoCaixa==null){    
            jFFluxoCaixa = new JFFluxoCaixa();
            mainpanel.add(jFFluxoCaixa); 
             jFFluxoCaixa.setVisible(true);      
        } 
    }     
  

    private void menuEstoqueActionPerformed(java.awt.event.ActionEvent evt) {
        verificaTelas();                                                   
        if(jFEstoque==null){    
            jFEstoque= new JFEstoque();
            mainpanel.add(jFEstoque);
             jFFluxoCaixa.setVisible(true);     
        }      
    }
    
    private JFFluxoCaixa jFFluxoCaixa;    
    private JFEstoque jFEstoque;    
    
}

Repare que no ActionPerformed de cada evento de JInternalFrame, estou invocando primeiramente o método verificaTelas(), isto porque, se for invocado depois de ter sido instanciado o JInternalFrame que voce quer abrir, este método o fechará depois, e voce não conseguiria ver o JInternalFrame.

Um abraço.

Fala galera, acabei de testar aqui, funcionou perfeitamente, entao a unica soluçao seria por meio de “if’s” mesmo né?

Outra duvida. na hora de instanciar a nova classe se eu faço assim:

[code]if (evt.getSource() == opcAgenda)
{
VerificaTela();
if(agenda==null){
agenda = new Agenda(“Cadastro de Cliente”, this);
jdPane.add(agenda); //se eu tento adicionar assim, com o setvisible(true) no construtor ou aki mesmo, nao funciona.
agenda.setVisible(true);
}

}

[/code]
não aparece nada, mas se eu coloco o setVisible(true) no construtor (da classe que estou chamando, no caso ‘agenda’), funciona. E pelo que vi no forum colocar o setvisible dentro do construtor pode nao ser uma boa ideia, entao, alguem sabe o que poderia estar errado, é assim mesmo que deveria ser feito? valeu.

Obrigado pela ajuda até agora.

[quote=tarlix]Fala galera, acabei de testar aqui, funcionou perfeitamente, entao a unica soluçao seria por meio de “if’s” mesmo né?

Outra duvida. na hora de instanciar a nova classe se eu faço assim:

[code]if (evt.getSource() == opcAgenda)
{
VerificaTela();
if(agenda==null){
agenda = new Agenda(“Cadastro de Cliente”, this);
jdPane.add(agenda); //se eu tento adicionar assim, com o setvisible(true) no construtor ou aki mesmo, nao funciona.
agenda.setVisible(true);
}

}

[/code]
não aparece nada, mas se eu coloco o setVisible(true) no construtor (da classe que estou chamando, no caso ‘agenda’), funciona. E pelo que vi no forum colocar o setvisible dentro do construtor pode nao ser uma boa ideia, entao, alguem sabe o que poderia estar errado, é assim mesmo que deveria ser feito? valeu.

Obrigado pela ajuda até agora.[/quote]

Entao cara, acredito que talvez por o seu setVisible estar dentro do IF… não pode, pois, se sua ja estiver instanciada, ela não irá usar o setVisible… não seria isto?

          if(agenda==null){      
                  agenda = new Agenda("Cadastro de Cliente", this);   
          } 
          jdPane.add(agenda);
          agenda.setVisible(true);    

Tenta ai pra ver…

Puts cara, o problema nao era estar dentro do if não, eu que estava fazendo besteira mesmo…

Fui dar contro c control v e depois ir mudando os nomes dos menus que seriam acionados e acabei deixando um …
ai na hora que fui fazer o que voce falou testei em outra classe e deu certo, ai parei pra ver pq nao funcionava na outra era por causa disso…

Desculpa :oops: :oops:

Problema resolvido!
Mto obrigado pela colaboração. desculpa d novo pelo engano.

:lol:

Beleza man, sem problemas :smiley: