Modal - Bloquear um JFrame enquanto outro está aberto

Tenho duas classes JFrame, por exemplo Cliente e LocalizaCliente, na classe Cliente existe um botão que lança a classe LocalizaCliente, o que eu quero é que quando a classe LocalizaCliente estiver aberta, a outra fique inacessível.

No delphi era só dar um LocalizaCliente.showModal, mas no java não sei como fazer isto, alguém sabe?

ou vc bota JFrame.setVisible(false) para deixar a classe cliente invisivel ou vc bota JFrame.setEnabled(false) para a classe cliente ficar visivel porem o usuario n podera acessar nenhum componente dela… nem mesmo minimizar ou fecha-la.

1 curtida

Não sei se está correto mais tente algo do tipo “underCorate” não me lembro bem como que o comando correto, só sei que me pareçe que desabilita a Frame .

[quote=fabiomagagnin]O que eu quero é que quando a classe LocalizaCliente estiver aberta, a outra fique inacessível.
[/quote]

A LocalizaCliente deveria ter sido derivada de JDialog, não de JFrame.

amigo é simples
basta colocar no construor da classe LocalizaCliente
this.setModal(true);

OBS: pode ser jFrame mesmo

espero ter ajudado , Boa Sorte !
abraços

1 curtida

[quote=thiagopassosp]amigo é simples
basta colocar no construor da classe LocalizaCliente
this.setModal(true);

OBS: pode ser jFrame mesmo
[/quote]

Só que esse método setModal(boolean) é da classe java.awt.Dialog, uma classe extendido pelo JDialog. Esse método não existe na classe JFrame.

[]s,
Sami

Viajei mesmo…
amigo vc vai ter que mudar para JDialog e implementar o this.setModal(true);

valeu por me corrigir Sami Koivu …
abraços

Ok, já percebi que deveria ter utilizado um JDialog, mas como já fiz em um JFrame, vou utilizar a sugestão do amigo Phiny:
JFrame.setEnabled(false);

Alguém ve problemas nisto?
Agradeço a colaboração e todos.

[quote=fabiomagagnin]Ok, já percebi que deveria ter utilizado um JDialog, mas como já fiz em um JFrame, vou utilizar a sugestão do amigo Phiny:
JFrame.setEnabled(false);

Alguém ve problemas nisto?
Agradeço a colaboração e todos.
[/quote]

Acho que você vai ter problemas se por acaso você clicar no frame Cliente (que vai para frente, o que não é o comportamento desejado.)

Setar o frame LocalizaCliente como “always on top” não corrige direito esse problema.

Olha usando a classe JDialog ou a classe JFrame vc pode bloquear q o usuário abra vários frames, por exemplo, cadastra clientes …

com o comando

:arrow: this.setFocusableWindowState(true);

com isso vc impede o usuário de ficar clicando e abrindo diversas janelas do mesmo cadastro …

Espero ter ajudado …

Valew :!:

1 curtida

Sei que esse topico é cavernoso, mas não achei solução na internet pro problema dele…

Acabei resolvendo sozinho mesmo, de um modo EXTREMAMENTE SIMPLES:

Primeiro instancie o JFrame que deseja chamar.

private Fornecedor_Dados_Adicionais Chamar_Fornecedor = new Fornecedor_Dados_Adicionais();

Depois use essa condicional no botão ou evento que deverá chamar o JFrame.

if (!Chamar_Fornecedor.isVisible()) { Chamar_Fornecedor.setVisible(true); }

Pronto… É absolutamente indispensável que o JFrame seja instanciado fora de qualquer metodo como um variável global (no caso private, hehe). Se você deixar pra instancia dentro do botão/evento toda vez clicar no botão ou o evento acontecer a classe será instanciada denovo e a nova instancia terá o “visible(false)”. É importantissimo instanciar por fora.

Para sair do JFrame que foi chamado sempre use o .setVisible(false), para que a condicional possa tornar a fazer efeito!

Espero que ajude alguem algum dia!

Boa noite a todos.

[quote=YuriPlanzo]Sei que esse topico é cavernoso, mas não achei solução na internet pro problema dele…

Acabei resolvendo sozinho mesmo, de um modo EXTREMAMENTE SIMPLES:

Primeiro instancie o JFrame que deseja chamar.

private Fornecedor_Dados_Adicionais Chamar_Fornecedor = new Fornecedor_Dados_Adicionais();

Depois use essa condicional no botão ou evento que deverá chamar o JFrame.

if (!Chamar_Fornecedor.isVisible()) { Chamar_Fornecedor.setVisible(true); }

Pronto… É absolutamente indispensável que o JFrame seja instanciado fora de qualquer metodo como um variável global (no caso private, hehe). Se você deixar pra instancia dentro do botão/evento toda vez clicar no botão ou o evento acontecer a classe será instanciada denovo e a nova instancia terá o “visible(false)”. É importantissimo instanciar por fora.

Para sair do JFrame que foi chamado sempre use o .setVisible(false), para que a condicional possa tornar a fazer efeito!

Espero que ajude alguem algum dia![/quote]

Com todo respeito, se voce acha que esse tópico é cavernoso, porém a sua dica é mais cavernosa ainda.

Imagine voce declarar todos os seus formulários desta forma:

private Fornecedor_Dados_Adicionais Chamar_Fornecedor = new Fornecedor_Dados_Adicionais();

Agora imagine se a sua aplicação contém 85 formulários com 85 declarações destas, imagine o quanto de memória voce vai ocupar, isto sem contar também que o Frame principal está instanciado, somente para voce controlar a visibilidade dos frames, isto é, quanto o assunto, é claro, é aplicações Desktop, porque em aplicações Web isto é terrível

Nada te impede de fazer isto, porém esta é uma prática pouco recomendada em sistemas SDI (Single Document Interface ou Interface de Documento Único), visto que o Frame Principal não mantém controle sobre os demais formulários abertos.

Já em sistemas MDI (Mutiple Document Interface ou Interface de Documentos Múltiplos), ai sim, voce pode até manter todos os formulários abertos, eis que existe um container em java chamado JDesktopPane que controla todos os JInternalFrames, entretanto mesmo assim não constitui uma boa prática de POO, até porque você não consegue atingir a velocidade da máquina para consultar todos os formulários ao mesmo tempo, o máximo que voce conseguirá e poluir a tela, e mesmo que os formulários esteja escondidos, há o problema de desempenho da aplicação em ocupação de memória, onde o JVM tem que administrar todo esses processos abertos. Portanto, manter todos os formulários abertos em que voce não esteja usando-o é disperdício de recurso que podem baixar cada vez mais o desempenho da sua aplicação.

Uma solução simples já foi apresentada aqui, ou seja, utilizar o JDialog, onde voce pode até fazer com que somente o FramePrincipal seja JFrame e os demais formulários possam ser JDialogs, entretanto há também a necessidade de se analisar o projeto com as seguintes questões, tanto em sistemas SDI quanto em MDI:

1º) Há a necessidade de manter todos os JFrames, Frames ou JInternalFrames abertos :?:

2º) Há a necessidade de que todos os Formulários sejam JDialogs ou apenas somente um ou no máximo tres :?:

Se vocês perceberem a pergunta do post do nosso amigo, verá que ele só necessita apenas de um JDialog, portanto a dica mais recomendade neste caso ele que utilize o JDialog.

Um abraço.

1 curtida

discorpio, obrigado pelo puxão!

Sou aluno de Ciência da Computação e estou cursando o 4º semestre. Infelizmente não recebemos foco especial em programação, mas sim em matemática! Então aprendo a programar programando… Estou escrevendo um software para a empresa onde trabalho: O Software irá gerar, armazenar e consultar RCP (Requisição de Compra e Pagamento) e RNF (Requisição de Nota Fiscal). O departamento que emite as NFs ja tem um software para faze-lo, mas os pedidos de nota fiscal ainda sao feitos pelo Excel, o que gera muito trabalho já que as planilhas não tem Banco de Dados.
Sempre estudo para tornar o codigo legível (boa pratica de programação, certo?), eficaz e ágil. Mas as vezes tropeço por falta de conhecimento…
Gostei das tuas dicas e não conheço os conceitos que você falou!! :shock: Vou estuda-los.

Ja havia lido sobre os JDialogs enquanto buscava uma solução na internet, mas arquivei pra estudar sobre eles depois (pelo visto começarei agora mesmo).

Acho fundamental que a aplicação apresente um alto desempenho, mas como disse, sou programador novato… Ainda aprendendo a aprender… :wink: Espero aprender bastante com vocês aqui do forum!

Abraços, irmão.
Fique com Deus.

Boa tarde Yuri.

Dizem que errar é humano, persistir no erro é burrice, porém reconhecer o erro é sabedoria.

Percebo que você tem futuro, e vai longe.

Assim como você, eu já errei muito, e descobri que é com os erros que a gente aprende. Portanto não tenha medo de errar, tenho medo, sim, de não tentar fazer.

Ayrton Senna uma vez disse.

Um abraço.

GUJ é Cultura.

Eu me deparei com o mesmo problema, mas resolvi através de eventos do JFrame, mas primeiro eu criei um método no formulário principal (o que eu quero deixar bloqueado ao fundo).

Primeiro criei uma variável do tipo static:

private static FormPrincipal instancia;

Depois criei o seguinte método no formulário principal:

        public static FormPrincipal getInstance(){ // MÉTODO QUE VERIFICA SE A INSTANCIA JÁ ESTÁ CRIADA (SINGLETON)
            if(instancia==null)
                instancia = new FormPrincipal();        
                return instancia;
        }

Depois, em outro form qualquer, eu criei os seguintes eventos:

private void formComponentHidden(java.awt.event.ComponentEvent evt) {
        FormPrincipal fp = FormPrincipal.getInstance();
        fp.setEnabled(true);
        fp.show();
    }

    private void formWindowClosed(java.awt.event.WindowEvent evt) {
        FormPrincipal fp = FormPrincipal.getInstance();       
        fp.setEnabled(true);
        fp.show();
    }

    private void formWindowIconified(java.awt.event.WindowEvent evt) {
        FormPrincipal fp = FormPrincipal.getInstance();             
        fp.show();       
    }

Resumindo, isso fez com que ao chamar um formulário qualquer, o formulário principal fique bloqueado ao fundo, e somente voltará a ser habilitado se o outro formulário for fechado: this.dispose();