Limitar número de JInternalFrame em um JDesktopPane

Bom dia galera!!!

Tem como limitar o número de JInternalFrame em um JDesktopPane? Queira que fosse instanciado somente 3 janelas no máximo e caso o usuario quisesse abrir outra ele exibisse uma mensagem para fechar uma ou mais janelas para continuar com aquela ação.

Desde já agradeço

Fiquem na PAZ.

É claro - você deu a resposta sem perceber. É só você localizar no seu programa onde é que se criam novas JInternalFrames, e contar quantas vezes você já criou. Quando atingir o número máximo, em vez de você criar uma nova JInternalFrame, crie um JOptionPane.showMessage que avise sobre a necessidade de fechar uma ou mais janelas para continuar com a ação.
Obviamente você precisa também pôr um listener em cada JInternalFrame, para diminuir o número de janelas quando você fechar uma delas.

[quote=thingol]É claro - você deu a resposta sem perceber. É só você localizar no seu programa onde é que se criam novas JInternalFrames, e contar quantas vezes você já criou. Quando atingir o número máximo, em vez de você criar uma nova JInternalFrame, crie um JOptionPane.showMessage que avise sobre a necessidade de fechar uma ou mais janelas para continuar com a ação.
Obviamente você precisa também pôr um listener em cada JInternalFrame, para diminuir o número de janelas quando você fechar uma delas. [/quote]

E ae bele Thingol?

Então eu fiz isso porém quando o usuario clica em ok na JOptionPane.showMessage ele instancia do mesmo jeito!! E outra a idéia que me sugeriram foi colocar um contator até ae tudo bem porém como faço pra quando fechar essa JinternalFrame esse contador seja decrementado sendo que o metodo esta na classe principal? :roll:

Não tem como debugar seu programa (usando o Eclipse ou NetBeans?)
Eu acho que você não está sabendo contar :stuck_out_tongue:

Dê uma olhada em:
http://java.sun.com/docs/books/tutorial/uiswing/events/internalframelistener.html
para saber quando seu JInternalFrame está sendo fechado.

[quote=thingol]Não tem como debugar seu programa (usando o Eclipse ou NetBeans?)
Eu acho que você não está sabendo contar :stuck_out_tongue:

Dê uma olhada em:
http://java.sun.com/docs/books/tutorial/uiswing/events/internalframelistener.html
para saber quando seu JInternalFrame está sendo fechado.
[/quote]

Oloco não sei contar… hahahahahaha… Tirou heim… rsrsrs… Brincadeira vou postar meu metodo aqui:

Esse é o qual eu chamo para verificar

public static void VerificaJanelas() {
        if (limitaJanelas == 3) {
            JOptionPane.showMessageDialog(null, "Número máximo de janela(s) aberta " +
                    " só pode ser de 3.\nFavor fechar uma ou mais para continuar " +
                    "esse processo.", "Atenção", JOptionPane.ERROR_MESSAGE);

        } else {
            limitaJanelas++;
        }

    }

e esse outro pra quando fechar o JinternalFrame


 public static void LiberaJanelas() {
        limitaJanelas--;
    }

O primeiro quando o cara clica no botão OK da mensagem de erro ele abre a instancia e aqui esta o metodo que chama ele

 public void chamaCliente() {
        //desativaHyperLink();
        //verificar nr maximo de janelas aberta
        VerificaJanelas();
        cadastroCliente chamaCli = new cadastroCliente();
        chamaCli.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        desktopMain.add(chamaCli);
        //transfere o focu para JinternalFrame
        desktopMain.getDesktopManager().activateFrame(chamaCli);
        chamaCli.setBounds(90, 90, 850, 650);
        System.out.println("executado");

    }

Sendo todos eles na minha classe principal. E agora clareou?

Hum - como é que está sendo declarada “limiteJanelas”? Dá a nítida impressão que (se você debugar o código) o valor vai ser sempre 0, não?

Outra coisa é que você precisa praticar “programação defensiva”.
Sabe a “direção defensiva” que o pessoal ensina para se safar no trânsito dos bandidos, seqüestros etc?
É mais ou menos a mesma coisa. No seu caso, em vez de testar contra exatamente == 3, você testaria para ver se é >= 3. É que se for 4, 5 etc (sei lá por quê ficaria com um valor maior, mas você sabe, “shit happens”) você nunca chegaria a limitar efetivamente o número de janelas.

[quote=thingol]Outra coisa é que você precisa praticar “programação defensiva”.
Sabe a “direção defensiva” que o pessoal ensina para se safar no trânsito dos bandidos, seqüestros etc?
É mais ou menos a mesma coisa. No seu caso, em vez de testar contra exatamente == 3, você testaria para ver se é >= 3. É que se for 4, 5 etc (sei lá por quê ficaria com um valor maior, mas você sabe, “shit happens”) você nunca chegaria a limitar efetivamente o número de janelas.
[/quote]

Ah pode crer vou seguir essa idéia, mas voltado ao problema acabei resolvendo em uma lógica até que simples dá uma olhada ae caso tem alguma sugestão para melhorar…

 private void chamaCotacao() {
        if (cotacao == 0) {
            if (limitaJanelas < maxJanelas) {

                telaCotacao cotacao = new telaCotacao();
                cotacao.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                cotacao.setVisible(true); // display frame  
                desktopMain.add(cotacao);
                //transfere o focu para JinternalFrame
                desktopMain.getDesktopManager().activateFrame(cotacao);
                cotacao.setBounds(90, 90, 850, 600);
                System.out.println("executado");
                limitaJanelas++;
                cotacao++;
            } else {
                JOptionPane.showMessageDialog(null, "Número máximo de janela(s) atingido, feche uma ou mais janelas\n" +
                        "para continuar essa ação.", "Atenção", JOptionPane.ERROR_MESSAGE);
            }
        } else {
            JOptionPane.showMessageDialog(null, "Janela de cotação já aberta.", "Atenção", JOptionPane.INFORMATION_MESSAGE);
        }

    }