Habilitar e Desabilitar Botões

Tenho uma dúvida cruel galera!
Eu precisava criar um formulário onde o botão “salvar” fica desabilitado.
Quando todos os JTextFields forem preenchidos, o botão fica habilitado para salvar.

O que devo fazer pra obter este efeito?

Pensei em criar um método que retorna verdadeiro ou falso e testa cada conteudo do JTextField pra ver se foi preenchido ou está em branco. Se todos estão preenchidos, é retornado true.
Este método é invocado no método interno do botão que define se ele está habilitado ou não.

A dúvida: este raciocínio está correto?
Se sim, como faço pra descobrir se JTextField está em branco ou não?
Precisaria criar um evento para atualizar esta condição todo o momento?
Desde já obrigado!

Num lembro…
tenta ai

NomedoTextField.equals(" ");

axo q é isso ve ai…
dar enable vc sab neh no button…
NomeButton.setEnable(true);

[quote=colored]Num lembro…
tenta ai

NomedoTextField.equals(" ");

axo q é isso ve ai…
dar enable vc sab neh no button…
NomeButton.setEnable(true);[/quote]

NomedoTextField.getText().equals(" ");

se não me engano é assim :slight_smile:

então galera, usei os exemplos citados acima e num funcionou muito não.
Daí pesquisando um pouco mais sobre java eu descobri o evento onChange, e a classe Document
Com isso eu “QUASE” resolvi meu problema, deixando o código assim:

[code]//declaração do button e JTextField

JTextField caixa;
JButton clique;

//(…) após mais umas declarações do meu formulário e tals…pq na verdade são várias caixas que precisarei, para compô-lo e preciso que todas estejam preenchidas pro botão ficar habilitado.

caixa = new JTextFiedl (15);
caixa.getDocument().addDocumentListener(
new DocumentListener(){
String texto;

public void insertUpdate (DocumentEvent evento){
clique.setEnabled(true);
}

public void removeUpdate (DocumentEvent evento){
texto = caixa.getText();

if(texto.length()<1)
clique.setEnabled(false);
}
public void changedUpdate (DocumentEvent evento){}
}
);

clique = new JButton(“Salvar”);
clique.setEnabled(false);

//(…)
[/code]

Bom este foi o trecho do código.
Percebi que ao mudar a comparação “if” pra “menor que 6”, se conter menos que seis caracteres minha caixa, o botão salvar não fica habilitado. Mas o estranho foi que ao repetir o mesmo processo para as outras caixas, fica como “se tivesse 1” o “6” que pus como comparação é como se não existisse. E ainda não consegui criar a dependência de “todas” as caixas estarem “escritas” para soh então habilitar o botão. Ou seja, se pelo menos uma, “mesmo que cada uma receba em separado o código acima”, é suficiente para habilitar o botão.

O que pensei, foi criar uam especie de ouvidor nas caixas e criar uma classe interna pra tratamento deste evento. Mas não sei como começar lógicamente este processo com DocumentListener?
Seria igual aos feitos com “actionlistener” por exemplo?
Se alguem conseguir visualizar minha idéia e ele tiver possibilidade de estar correta, peço que me dê este caminho, pelo menos lógicamente, pra eu encerrar esta questão e dúvida.
Caso minha idéia esteja errada, peço o “clareamento” de idéias pra eu eliminar este problema.

Uma coisa que estou notando, é que isso pode render um bom tutorial, visto que é uma coisa comum de se ver em algumas aplicações gráficas. E um tanto quanto mais simples em outras linguagens, pelo que andei conversando com amigos que programam em outras LPs.

Tem (pelo menos) dois jeitos de fazer isso…

Primeiro: Criar uma Thread, que de tempos em tempos (nem muito rápido, pra não ficar "pesado", nem muito devagar, algo em torno de meio segundo) verifica se o conteudo da(s) caixa(s) de texto(s) é diferente de vazio. Se for diferente, torna o botão "clicável".

Mais ou menos assim:

Thread t = new Thread(){
    public void run(){
        while (true){
            if(textField1.getText().length() &gt; 0 && textField2.getText().length() &gt; 0){
                button.setEnabled(true);
            } else {
                button.setEnabled(false); //pode ser que o usuário apague o texto
            }
            try {
                sleep(500); //meio segundo
            } catch (InterruptedException e) {}
         }
    }
};
t.start();

Segundo: usar um javax.swing.event.CaretListener pra ficar monitorando mudanças no TextField…

CaretListener listener = new CaretListener() {
    public void caretUpdate(final CaretEvent e) {
        //faz as verificações necessárias.. tamanho de campo, validação, etc.
        if(textField.getText().length() &gt; 0 && textField_1.getText().length() &gt; 0){
            button.setEnabled(true);
        } else {
            button.setEnabled(false);
        }
    }
};
textField1.addCaretListener(listener);
textField2.addCaretListener(listener);

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html
http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/event/CaretListener.html

Abraços o/

(se funcionar, dá um toque eheh)

Preco, obrigado por me ajudar! Fiquei sem net por uns tempos e por isso demorei a postar.
Já resolvi o problema e este tópico já pode ser fechado como resolvido(num sei como faz isso…)
Mesmo assim testarei sua dica pra ver como fica :wink:

Quanto a solução, foi algo simples:

Primeiramente eu criei um classe interna e privada pra tratar minhas textfields, com base na ultima mensagem postada por mim:

[code]private class TratadorEventos implements DocumentListener{
String texto, txt2, txt3, txt4, txt5;

public void insertUpdate (DocumentEvent evento){
texto = jTextField5.getText();
txt2 = jTextField2.getText();
txt3 = jTextField3.getText();
txt4 = jTextField4.getText();
txt5 = jTextField5.getText();

if (texto.length()>=6) {
if (txt2.length()>=6) {
if (txt3.length()>=6) {
if (txt4.length()>=6) {
if (txt5.length()>=6) {

				jButton1.setEnabled(true);}
			
		}
	}
}

}

}

public void removeUpdate (DocumentEvent evento) {
texto = jTextField5.getText();
txt2 = jTextField2.getText();
txt3 = jTextField3.getText();
txt4 = jTextField4.getText();
txt5 = jTextField5.getText();

if (texto.length()<7) {
jButton1.setEnabled(false);}
else if(txt2.length()<7){
jButton1.setEnabled(false);}
else if(txt3.length()<7){
jButton1.setEnabled(false);}
else if(txt4.length()<7){
jButton1.setEnabled(false);}
else if(txt5.length()<7){
jButton1.setEnabled(false);}

}

public void changedUpdate(DocumentEvent evento){}

} [/code]

Como podem ver, eu criei Strings pra armazenar o conteudo das caixas de textos e comparei por meio da função “SE” afim de saber se foi preenchido o mínimo necessário de caracteres pra cada campo, pra só depois que checar todos, habilitar meu botão. =]

Fiz o processo inverso pro metodo removeUpdate. Assim com este ouvidor, qnd um conteudo de quaisquer jTextField for alterado, o ouvidor faz os testes apropriados.

Na classe de formulário meu, foi soh implementar os ouvidores e problema resolvido =]
Forte Abraço a todos!