Habilitar botão ao ter todos os campos preenchidos[RESOLVIDO]
26 respostas
T
tiagofla
Boa tarde galera!
Tenho a seguinte dúvida mencionada no título do tópico. Queria habilitar o botão Ok da minha aplicação (swing) somente quando os 6 campos (JTextField) estiverem preenchidos. Já procurei no google e aqui no Guj mas ainda não achei a solução. Nunca fiz aplicação swing e estou com essa dúvida. Tem que ser tipo em tempo de execução da aplicação. Vou preenchendo os campos, e quando todos estiverem preenchidos, botão ok habilita. Espero que possam me ajudar.
Desde já agradeço.
Obs: Gostaria de saber se é necessário encerrar o tópico. Se sim, como faço?
Cria uma método validador de campos…
Não é uma meneira bonita de se fazer mas é uma solução…
Adicione eventos nos campos, chamando a validação que vc criou…
Ao término quando a validação tiver OK, vai liberar o botao…
Não cara na verdade você precisa ter o listener especifico para cada tipo de objeto.
Tipo você cria o método que verifica se os campos estão preenchidos e se estiver ele habilita o botão, tipo se o combo não está com o valor selecione ou se o textfield é diferente de vazio.
e ai você faz a chamada ao método nos listeners adicionados em cada campo, tipo FocusListener para o textfield e changeListener para combo. Você vai ter que pesquisar o listener especifico para cada componente que utilizar.
T
tiagofla
Fiz aqui. Achei algo no google e fiz. Fiz da seguinte forma:
JTextField1.getDocument().addDocumentListener(newDocumentListener(){Stringstr1;@OverridepublicvoidremoveUpdate(DocumentEventarg0){str1=JTextField1.getText();if(str1.length()<1)btnOk.setEnabled(false);//Botão Ok desabilitado}@OverridepublicvoidinsertUpdate(DocumentEventarg0){btnOk.setEnabled(true);//Botão Ok habilitado}@OverridepublicvoidchangedUpdate(DocumentEventarg0){}});
Só que tenho 7 JTextField que tem que ser verificado, ou seja, todos devem estar preenchidos para que o botão habilite. Se eu fizer esse getDocument em todos os JtextField terá uma falha. Pois ele fará uma verificação independente. A verificação será feita somente no primeiro JTextField. Se esse primeiro estiver preenchido, o botão sempre vai habilitar, e se os demais não estiverem preenchidos o botão continua habilitado pois o 1º está preenchido. Fica bizarro. Alguém uma idéia de como posso melhorar isso??
Tipo fazer a verificação nos componentes JTextFields da tela. Fazer pra qq tipo JTextField.
T
TheKill
Vai precisar esse trecho de codigo para cada JTextField…
T
tiagofla
Sim mas vai cair no erro que mencionei. O programa vai verificar o 1º JTextField…“Está preenchido?” se sim Habilita botão senão mantém desabilitado. E vai ignorar os demais. Ele tem que permitir habilitar o botão quando todos os JTextFields estiverem prenchidos. Se um não estiver, mantém desabilitado.
T
TheKill
Por isso falei pra vc criar o metodo de validação de Todos os campos da tela!!!
Veja os post´s acima comentados
T
TheKill
TheKill:
Cria uma método validador de campos..
Não é uma meneira bonita de se fazer mas é uma solução..
Adicione eventos nos campos, chamando a validação que vc criou..
Ao término quando a validação tiver OK, vai liberar o botao..
que tal criar um listener de foco para cada campo retornando uma variavel caso
o .getText() de cada um dos campos retornar diferente de vazio.
Depois criar uma estrutura de condição para dar setEnabled(true)
apenas quando houver retorno diferente de vazio para cada campo.
T
tiagofla
Será que isso não deve ser feito em algum evento do botão? Tipo o default dele é setEnabled(false) e quando todos os JTextField estiverem preenchidos, habilitar o botão. Em outras linguagens isso é fácil de se implementar. Ja fiz isso no C#.
L
luizalfredohartke
nao, a propriedade de habilitado ou desabilitado nao precisa de um evento pra que seja mudado,
eu sugiro que você faça é criar eventos para os capos de texto para que cada vez que eles recebam foco, ou seja, sejam selecionados para
mudança escrita de texto, voce dispare uma flag que indique que foram modificados para diferente de null ou algo que você preferir.
assim quando todos os campos estiverem retornando como preenchidos (ou algo que voce escolha) voce possa dar um .setEnabled(true) no seu jbutton.
Vou avisando não testei o código mas acredito que ele vai te fazer entender a ideia.
T
tiagofla
luciano@@,
Testei dessa forma aí e não deu certo.
L
luizalfredohartke
que IDE voce ta usando?
T
tiagofla
eclipse.
L
luizalfredohartke
voce entendeu a solução q eu propus ali acima?
T
tiagofla
Não entendi muito bem. Acho que vc quis dizer é pra implementar o método da interface FocusListener pra cada componente JTextField, semelhante ao que o luciano fez??
T
tiagofla
Juntei a idéia do luizalfredohartke com a do luciano e deu certo em parte. Só que ao rodar a aplicação, o botão ok ja está habilitado. Ele só desabilita quando o primeiro JTextField do meu form perde o foco, ou seja, o cursor muda pra outro JTextField. Acho que não deveria seu FocusListener e sim outra interface.
T
tiagofla
Procurei aqui mas não achei uma solução. Esse do focus não ficou legal. Tentei com várias interfaces mas não deu certo. Continuarei procurando no pai google de ogum pra ver se acho algo. Numa merda de um visual studio da vida faria isso em 1 minuto.
L
luciano2
O default do botão é habilitado, para que o botão apareça desabilitado você vai ter que configurar isso.
G
guilherme.dio
Se precisar de um JAR para validação dinâmica, baixe o meu(aidna estou modificando alguns detalhes, mas funciona!):