Dúvida na criação de classe de mascara para telefone extendendo PlainDocument [RESOLVIDO]

Fala galera tudo bem? Eu estou com problema de lógica numa classe que estou fazendo para mascara de telefone extendendo da classe PlainDocument. De início eu usava a classe MaskFormatter mas começou ter uns bugs que eu não gostei, então resolvi fazer dessa maneira. Eu fiz pra Cep e estou aproveitando a classe para fazer pra telefone. Vejam o código:

[code]public class Telefone extends PlainDocument {

public Telefone(){
		
}

public void insertString(int off, String string, AttributeSet attr)
		throws BadLocationException {
	
	
if(off < 10){
		if(!Character.isDigit(string.charAt(string.length()-1))){
			return;		
		}else{
		
			
			
		if(off == 0){
			
			string = string.concat("(");
		}
		
		if (off == 3){
			
			string = string.concat(")");
			
		}
		
		
		if(off == 9){
			
			String dataString = getText(0, off)+string;
			
							
		}
		
		super.insertString(off, string, attr);
		}
	}
}

}
[/code]

A dúvida é: somente quando eu digitar o primeiro dígito, é quando vai aparecer o “(”. Só que eu quero fazer ele aparecer antes de aparecer o primeiro dígito. Ex: (**)-

Eu já tentei colocar a linha de comando string = string.concat("("); antes do if mas não funciona.

Será que vocês podem me ajudar nesse código? Aguardo a ajuda de vocês, obrigado.

Não seria porque voce está adicionando a uma String já existente.

A classe Telefone:

class Telefone extends PlainDocument {

        public Telefone() {
        }

        public void insertString(int off, String string, AttributeSet attr)
                throws BadLocationException {
            // (83) 3498-1091
            if (off < 14) {
                if (!Character.isDigit(string.charAt(string.length() - 1))) {
                    return;
                } else {
                    if (off == 0) {
                        string = "(".concat(string);
                    }
                    if (off == 2) {
                        string = string.concat(")");
                    }
                    if (off == 8) {
                        string = string.concat("-");
                    }
                    super.insertString(off, string, attr);
                }
            }
        }
    }

Veja se ajuda…

Att.

Deu certo!! Valeu mesmo pela ajuda. :wink:

Até mais.

Queria aproveitar e tirar mais uma dúvida. Eu procurei sobre isso e não achei nada parecido. Essa classe que eu fiz apenas vai colocando as mascaras em tempo de execução conforme vai digitando no jTextField, mas fora isso não faz mais nada. Então se eu digito apenas metade do campo (ex: “(12)3321-” ) e tento gravar no banco, ele grava normalmente. Então eu queria saber se tem como fazer com que não deixe gravar no banco enquanto não preencher totalmente o campo? Mas que também não deixe perder o foco como é o caso do Mask Formatter. Que não dê aquele bug se eu deletar e depois voltar no campo ele preencher o último dado digitado automaticamente. Isso era um problema que eu tinha no Mask Formatter. Será que tem como tratar pra isso não acontecer também? Desculpem se eu estou pedindo demais. É que eu sou bem amador nisso e não tenho idéia de como fazer mesmo.

Eu fiz uma classe dessa pra cada coisa como CPF, RG, Data… aí eu usaria esse recurso em todas as classes.

Vou ficar no aguardo, valeu.

Uma mudança na classe Telefone


class Telefone extends PlainDocument {
        public void insertString(int off, String string, AttributeSet attr)
                throws BadLocationException {
            if (off < 14) {
                if (!Character.isDigit(string.charAt(string.length() - 1))) {
                    return;
                } else {
                    if (off == 0) {
                        string = "(".concat(string);
                    }
                    if (off == 2) {
                        string = string.concat(")");
                    }
                    if (off == 8) {
                        string = string.concat("-");
                    }
                    super.insertString(off, string, attr);
                    valid = off == 13;
                }
            }
        }
        private boolean valid = false;

        public boolean isValid() {
            return valid;
        }
    }

E no componente JTextField que adiciona esta classe como documento, faria assim:

        JTextField texto = new JTextField();
        texto.setDocument(new Telefone());
        texto.addFocusListener(new FocusAdapter() {

            @Override
            public void focusLost(FocusEvent e) {
                JTextField text = (JTextField) e.getComponent();
                Telefone telefone = (Telefone) text.getDocument();
                if (telefone.isValid()) {
                    super.focusLost(e);
                } else {
                    text.requestFocus();
                }
            }
        });

Veja se ajuda…

Att…

Fiz o teste aqui e quando chega no campo telefone, ele trava tudo. Dá pra preencher certinho o campo, mas depois não deixa gravar e não deixa cancelar a tela e nem voltar pra outro campo. Só clicando no X pra fechar a tela mesmo. O que será que pode ser? Veja como ficou o código. Vou colocar a classe Telefone inteira pra você ver.

[code]public class Telefone extends PlainDocument {

public Telefone(){
		
}

public void insertString(int off, String string, AttributeSet attr)
		throws BadLocationException {
	
	
if(off < 13){
		if(!Character.isDigit(string.charAt(string.length()-1))){
			return;		
		}else{
		
			
			
		if(off == 0){
			
			
			string = "(".concat(string);  
		}
		
		if (off == 2){
			
			string = string.concat(")");
			
		}
		
		if (off == 7){
			
			string = string.concat("-");
			
		}
		
		
		if(off == 9){
			
			String dataString = getText(0, off)+string;
			
							
		}
		
		super.insertString(off, string, attr);
		valid = off == 13;
		}
	}
}
private boolean valid = false;  
 public boolean isValid() {  
	 return valid;  

}}
[/code]

E no jTextField ficou assim:

[code]private JTextField getJTextFieldTel() {
if (jTextFieldTel == null) {
jTextFieldTel = new JTextField();
jTextFieldTel.setDocument(new Telefone());
jTextFieldTel.addFocusListener(new FocusAdapter() {

			 public void focusLost(FocusEvent e) {  
				         JTextField text = (JTextField) e.getComponent();  
				         Telefone telefone = (Telefone) text.getDocument();  
				         if (telefone.isValid()) {  
				             super.focusLost(e);  
				         } else {  
				             text.requestFocus();  
				         }  
				     }  
				 });  
	
		jTextFieldTel.setBounds(new Rectangle(428, 280, 118, 20));
		
		
		}
		
	return jTextFieldTel;
}

[/code]

Perceba que o valor da comparação tem que estar dentro do seu if.

if(off < 13){
			if(!Character.isDigit(string.charAt(string.length()-1))){
				return;		
			}else{
			
				
				
			if(off == 0){
				
				
				string = "(".concat(string);  
			}
			
			if (off == 2){
				
				string = string.concat(")");
				
			}
			
			if (off == 7){
				
				string = string.concat("-");
				
			}
			
			
			if(off == 9){
				
				String dataString = getText(0, off)+string;
				
								
			}
			
			super.insertString(off, string, attr);
			valid = off == 13;
			}
		}

Ele nunca será validado com true, pois quando o valor de off for 13 ele nem entrará no if, então mude para

valid = off==12;

Pois assim verificará se existe algo no ultimo caracter.

Veja se ajuda…

Att…

Entendi. Agora deu certo, acabei de testar aqui. Desculpe a demora pra responder, eu estava na faculdade. Esse negócio é pra um cadastro de clientes que eu estou fazendo, é pro meu TCC.

Valeu mesmo pela ajuda, você me ajudou muito.

Até mais. :wink: