MDI: jInternalFrame Abrindo apenas 1 janela por vez

Saudações…
Estou tentando controlar a abertura de um jInternalFrame para q seje aberto somente uma vez.
Caso já esteje aberto traga-o pra frente.
Estou tentando usar o código abaixo, mas está com um erro na inicialização da variável.

É assim mesmo que controlo se o jInternalFrame já está aberto ?

private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        if (evt.getSource() == jMenuItem1) {
            if (fi == null){
                CadClientes fi = new CadClientes();
            }
            else {
                DesktopPane.moveToFront(fi);
            }
        }
}

Grato pela oportunidade.

Essa sua variavel “fi” é global e dentro do if que você verifica se é null você cria outra variavel.

Faça assim que funciona.

Para melhor controle dos JInternalFrame abertos utilize o método do JDesktopPane.getAllFrames(), esse método te retorna todos os JInternal abertos no JDesktopPane dentro de um vetor de JInternalFrame, dessa forma basta você verificar se o JInternal que será criado já existe no vetor.

Mto obrigado deu certo.
Mas surgiu outro problema, com a 1a resposta a minha dúvida.

Qnd fecho o jInternalFrame ele não abre novamente.

Para resolver, se por acaso qnd fechar o jInternalFrame e setar a variável (fi) como NULL.
É a forma correta de se resolver ?

Isso, quando ele for fechado sete a variavel fi como null, e se ele já estiver aberto, no caso se for diferente de null, utilize o setSelected(true). Isso fara com que ele seja selecionado e não apenas seja movido para frente. Lembrado que o setSelected() da classe JInternalFrame gera uma exception e deve ser tratada.

Para abrir as janelas (JInternalFrame) no JDesktopPane, eu utilizo da seguinte forma:

Tenho uma função que fica na TelaPrincipal.java que adiciona as telas no Desktop:

    //ADICIONA TELAS (JInternalFrame) AO JDesktopPane
    // usado assim: this.addTelaDesk(new TelaFuncionarios(null));
    public void addTelaDesk(JInternalFrame tela){
        for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
            // se uma janela semelhante estiver aberta
            if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
                jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
                
                Object[] opções = {"Utilizar Aberta", "Abrir Nova"};
                int qst = JOptionPane.showOptionDialog(null, "Abrir uma nova janela ou utilizar a que ja esta aberta?",
                                                "Janela duplicada",
                                                JOptionPane.DEFAULT_OPTION,
                                                JOptionPane.QUESTION_MESSAGE,
                                                null,
                                                opções,
                                                opções[0]
                                        );
                // se utilizar a aberta retorna e não abre outra,
                // caso contrário sai do for e abre outra igual
                if(qst == 0){
                    return;
                }else if(qst == 1){
                    break;
                }
            }
        }

        this.telaDesktop.add(tela); //adiciona na tela
        tela.setVisible(true); // seta visivel
        this.cascade(); //coloca em cascata para deixar "pratico"
    }

A função para colocar em cascata:

    private void cascade() {
        JDesktopPane desk = this.getTelaDesktop(); // JDesktopPane
        Rectangle dBounds = desk.getBounds(); // Bordas do JDesktopPane
        int separation = 25; // distancia entre as janelas

        // Pega todos os frames e organiza, o ultimo fica mais em baido e mais pra cima
        int i = desk.getAllFrames().length; // quantidade de frames
        for (JInternalFrame f : desk.getAllFrames()) {
            f.setLocation(i*separation, i*separation);
            i--; //mutiplicador
        }
    }  

Exemplos de como chamar depois:


this.addTelaDesk(new TelaFuncionarios(null));

String matricula = JOptionPane.showInputDialog("Digite a matrícula do funcionário:");
this.addTelaDesk(new TelaFuncionarios(matricula));

Pra mim ta funcionando bem como quero, mas qualquer sugestão é bem vinda!

Abraços

Para abrir as janelas (JInternalFrame) no JDesktopPane, eu utilizo da seguinte forma:

Tenho uma função que fica na TelaPrincipal.java que adiciona as telas no Desktop:

    //ADICIONA TELAS (JInternalFrame) AO JDesktopPane
    // usado assim: this.addTelaDesk(new TelaFuncionarios(null));
    public void addTelaDesk(JInternalFrame tela){
        for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
            // se uma janela semelhante estiver aberta
            if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
                jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
                
                Object[] opções = {"Utilizar Aberta", "Abrir Nova"};
                int qst = JOptionPane.showOptionDialog(null, "Abrir uma nova janela ou utilizar a que ja esta aberta?",
                                                "Janela duplicada",
                                                JOptionPane.DEFAULT_OPTION,
                                                JOptionPane.QUESTION_MESSAGE,
                                                null,
                                                opções,
                                                opções[0]
                                        );
                // se utilizar a aberta retorna e não abre outra,
                // caso contrário sai do for e abre outra igual
                if(qst == 0){
                    return;
                }else if(qst == 1){
                    break;
                }
            }
        }

        this.telaDesktop.add(tela); //adiciona na tela
        tela.setVisible(true); // seta visivel
        this.cascade(); //coloca em cascata para deixar "pratico"
    }

A função para colocar em cascata:

    private void cascade() {
        JDesktopPane desk = this.getTelaDesktop(); // JDesktopPane
        Rectangle dBounds = desk.getBounds(); // Bordas do JDesktopPane
        int separation = 25; // distancia entre as janelas

        // Pega todos os frames e organiza, o ultimo fica mais em baido e mais pra cima
        int i = desk.getAllFrames().length; // quantidade de frames
        for (JInternalFrame f : desk.getAllFrames()) {
            f.setLocation(i*separation, i*separation);
            i--; //mutiplicador
        }
    }  

Exemplos de como chamar depois:


this.addTelaDesk(new TelaFuncionarios(null));

String matricula = JOptionPane.showInputDialog("Digite a matrícula do funcionário:");
this.addTelaDesk(new TelaFuncionarios(matricula));

Pra mim ta funcionando bem como quero, mas qualquer sugestão é bem vinda!

Abraços

[quote=rcipriani]Para abrir as janelas (JInternalFrame) no JDesktopPane, eu utilizo da seguinte forma:

Tenho uma função que fica na TelaPrincipal.java que adiciona as telas no Desktop:

    //ADICIONA TELAS (JInternalFrame) AO JDesktopPane
    // usado assim: this.addTelaDesk(new TelaFuncionarios(null));
    public void addTelaDesk(JInternalFrame tela){
        for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
            // se uma janela semelhante estiver aberta
            if(jInternalFrame.getClass().toString().equalsIgnoreCase(tela.getClass().toString())){
                jInternalFrame.moveToFront(); // traz janela para frente para facilitar a escolha
                
                Object[] opções = {"Utilizar Aberta", "Abrir Nova"};
                int qst = JOptionPane.showOptionDialog(null, "Abrir uma nova janela ou utilizar a que ja esta aberta?",
                                                "Janela duplicada",
                                                JOptionPane.DEFAULT_OPTION,
                                                JOptionPane.QUESTION_MESSAGE,
                                                null,
                                                opções,
                                                opções[0]
                                        );
                // se utilizar a aberta retorna e não abre outra,
                // caso contrário sai do for e abre outra igual
                if(qst == 0){
                    return;
                }else if(qst == 1){
                    break;
                }
            }
        }

        this.telaDesktop.add(tela); //adiciona na tela
        tela.setVisible(true); // seta visivel
        this.cascade(); //coloca em cascata para deixar "pratico"
    }

A função para colocar em cascata:

    private void cascade() {
        JDesktopPane desk = this.getTelaDesktop(); // JDesktopPane
        Rectangle dBounds = desk.getBounds(); // Bordas do JDesktopPane
        int separation = 25; // distancia entre as janelas

        // Pega todos os frames e organiza, o ultimo fica mais em baido e mais pra cima
        int i = desk.getAllFrames().length; // quantidade de frames
        for (JInternalFrame f : desk.getAllFrames()) {
            f.setLocation(i*separation, i*separation);
            i--; //mutiplicador
        }
    }  

Exemplos de como chamar depois:


this.addTelaDesk(new TelaFuncionarios(null));

String matricula = JOptionPane.showInputDialog("Digite a matrícula do funcionário:");
this.addTelaDesk(new TelaFuncionarios(matricula));

Pra mim ta funcionando bem como quero, mas qualquer sugestão é bem vinda!

Abraços

[/quote]

Este método ficou muito bom fiz alguma modificação para se adequar a minha necessidade, ajudou muito …

Agora, por acaso você tem alguma ideia de como fazer para que enquanto o usuário estiver usando uma tela ele não posso abrir outra?

Vlw

Pessoal estes dois métodos funcionaram perfeitamente na minha aplicação… Obrigado Colegas do GUJ…

Agora preciso fechar todos os outro internalframe que foi aberto anteriormente no jdesktopPanel alguem pode me ajudar??

obrigado…

Pessoal Consegui aqui… muito fácil segue abaixo a função com o msm procedimento do nosso colega acima…

public void addTelaDesk(JInternalFrame nova){
for (JInternalFrame jInternalFrame : this.getTelaDesktop().getAllFrames()) {
// se algum JInternalFrame estiver aberto, feche o
jInternalFrame.setClosed(true);
}

this.telaDesktop.add(nova); //adiciona na tela  
tela.setVisible(true); // seta visivel  

}

Para quem tem um desktopPanel este metodo fecha todos internalFrames ao abrir um.
É o mesmo do amigo ai de cima só alterei uma linha pois não estava fechando todas.

public void addTelaDesk(JInternalFrame nova) throws PropertyVetoException {
for (JInternalFrame jInternalFrame : this.painelPrincipal.getAllFrames()) {
// Aqui fecho tudo que tem no meu DesktopPainel
painelPrincipal.removeAll();
}

    painelPrincipal.add(nova); //adiciona na tela 
    nova.setVisible(true); // seta visivel 

}

segue um video explicativo: