Limitar número de JInternalFrame em um JDesktopPane
7 respostas
O
ozzy
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.
É 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.
O
ozzy
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.
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:
T
thingol
Não tem como debugar seu programa (usando o Eclipse ou NetBeans?)
Eu acho que você não está sabendo contar
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
publicvoidchamaCliente(){//desativaHyperLink();//verificar nr maximo de janelas abertaVerificaJanelas();cadastroClientechamaCli=newcadastroCliente();chamaCli.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);desktopMain.add(chamaCli);//transfere o focu para JinternalFramedesktopMain.getDesktopManager().activateFrame(chamaCli);chamaCli.setBounds(90,90,850,650);System.out.println("executado");}
Sendo todos eles na minha classe principal. E agora clareou?
T
thingol
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?
T
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.
O
ozzy
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.
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);
}
}