Bem galera eu gostaria de fazer um TextField quando eu digitasse ficasse mascarado como a propriedade TextField.PASSWORD porém essa propriedade é considerada uma propriedade que aceita numeros e letras eu gostaria que o meu fosse igual um TextField.NUMERIC ou seja que só aceitasse números, mas que esses fossem mascaradas igual ao password.
Bem alguem tem ideia de como fazer isso acredito que seja simples, procurei mas como estou sem muito tempo minha procura foi muito breve =/ acredito que a galera possa me auxiliar mais rapidamente kkk obrigado!
Por que tal restrição?
Ideia simples, fazer um campo de passwords que aceitem apenas números, bem isso é bem utilizado em muitos projetos e no projeto que eu estou fazendo é um deles, o campo de password deve ser preenchido apenas com numeros e eu não gostaria de fazer um campo password que mostrasse a senha quando o usuário digitasse pois é meio incoveniente…
Para isso necessito de tal restrição.
use a classe abaixo que vai dar certo…
seguinte… ao inves de instanciar um JTextField ( seuTextField = new JTextField() )voce instancia o JPasswordNumber (
seuTextField = new JPasswordNumber( 6 ) -> onde 6 é a quantidade máxima permitida de caracteres ) e pronto!
espero ter ajudado…
import javax.swing.*;
import javax.swing.text.*;
import java.awt.Toolkit;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;
/**
* JPasswordNumber personalizado permitindo somente números.
*/
public class JPasswordNumber extends JPasswordField
{
private Toolkit toolkit;
private NumberFormat integerFormatter;
private int maxDigits;
/**
* Constrói um novo JPasswordNumber com máximo de caracteres igual a
* maxNoDigits.
*
* @param maxNoDigits
* Um inteiro contendo o número máximo de caracteres do campo.
*/
public JPasswordNumber( int maxNoDigits )
{
super( maxNoDigits - 1 );
toolkit = Toolkit.getDefaultToolkit();
integerFormatter = NumberFormat.getNumberInstance( Locale.US );
integerFormatter.setParseIntegerOnly( true );
if( maxNoDigits < 1 ) {
maxDigits = 99;
} else {
maxDigits = maxNoDigits;
}
}
/**
* Construtor, Constrói um novo JPasswordNumber com tamanho máximo de 99.
*/
public JPasswordNumber()
{
super( 4 );
toolkit = Toolkit.getDefaultToolkit();
integerFormatter = NumberFormat.getNumberInstance( Locale.US );
integerFormatter.setParseIntegerOnly( true );
maxDigits = 99;
}
/**
* Retorna o comprimento do JPasswordNumber .
*
* @return Um inteiro contendo o total de caracteres no campo.
*/
public int getlength()
{
String fieldValue = getText();
return ( fieldValue.length() );
}
/**
* Retorna o valor do JPasswordNumber .
*
* @return Um inteiro contendo o texto do campo.
*/
public int getValue()
{
int retVal = 0;
try {
retVal = integerFormatter.parse( getText() ).intValue();
}
catch( ParseException e ) {
// Isto nunca deveria acontecer porque insertString permite
// apenas dados propriamente formatados para inserir no
// JPasswordNumber .
toolkit.beep();
}
return retVal;
}
/**
* Seta o valor passado no JPasswordNumber .
*
* @param value
* Um inteiro contendo o valor a ser escrito no campo.
*/
public void setValue( int value )
{
setText( integerFormatter.format( value ) );
}
/**
* Seta o número máximo de caracteres no JPasswordNumber .
*
* @param value
* um inteiro contendo a capacidade máxima do campo.
*/
public void setMaxDigits( int value )
{
if( value > 0 ) {
maxDigits = value;
}
}
/**
* Retorna o número máximo de caracteres no JPasswordNumber .
*
* @return Um inteiro contendo o máximo de caracteres suportado pelo campo.
*/
public int getMaxDigits()
{
return maxDigits;
}
/**
* Limpa o JPasswordNumber .
*/
public void clearField()
{
setText( "" );
}
/**
* retorna o que está escrito no JPasswordNumber de acordo com a quantidade maxima de
* caracteres definida.
* @return void
*/
public String getText()
{
if( getMaxDigits() >= super.getText().length() ) {
return super.getText();
}
return super.getText().substring( 0, getMaxDigits() );
}
/**
* Cria um novo documento padrão para o campo.
*
* @return Um documento novo que será aplicado no componente.
*/
protected Document createDefaultModel()
{
return new WholeNumberDocument();
}
protected class WholeNumberDocument extends PlainDocument
{
/**
* Insere o texto digitado no campo, conforme ele é digitado. Caso um
* caracter não permitido seja digitado, não é exibido.
*
* @param offs
* Um inteiro contendo a capacidade do campo.
* @param str
* Uma String contendo o texto a ser inserido no campo.
* @param a
* Um AttributeSet contendo os atributos.
*/
public void insertString( int offs, String str, AttributeSet a )
throws BadLocationException
{
char[] source = str.toCharArray();
char[] result = new char[source.length];
int j = 0;
for( int i = 0; i < result.length; i++ ) {
// impede a quebra de linha de ser mostrada no campo.
if( ( Character.isDigit( source[i] ) )
&& ( offs < ( maxDigits ) ) && (int)source[i] != 10 ) {
result[j++] = source[i];
} else {
toolkit.beep();
}
}
super.insertString( offs, new String( result, 0, j ), a );
}
}
}
Amigo mas uma pergunta, me desculpe se eu estiver equivocado mas vendo sua resposta eu lhe pergunto, isso ficará portavel para um dispositivo utilizando MIDP 2.0 e CLDC 1.1 ? pois vejo muitas classes que vc importou como swing e awt e se não me engando não são todos os dispositivos moveis como celulares que utilizam essas classes, posso estar errado kkk mas pelo oque eu havia lido eles não tinham esse tipo de suporte por isso que utilizamos essas API’S a HIGH-LEVEL ou a LOW-LEVEL para ficar portavel a um dispositivo móvel, e eu estou fazendo um aplicativo para celulares comuns não PDA’S ou CDC’S mas tudo bem. Bem muito obrigado pelo post vou tentar implementar isso.
foi mal!
não lí em qual forum estava a sua pergunta (Java Micro Edition) e peço desculpas… essa solução não foi pensada para JME.
=/
[color=red]SOLUÇÃO REAL:[/color]
Uffa até que enfim, pesquisei e encontrei… podemos declarar o constante PASSWORD com outra utilizando o bitwise |(OR) então é só fazer um TextField mais ou menos assim:
TextField txtPass = new TextField(“Senha”, null, 8, TextField.PASSWORD|TextField.NUMERIC);
E pronto temos um TextField apenas NUMERIC utilizando PASSWORD kkkk vixe ainda bem que não tentei implentar seu código dalifreire mas não tem problema não é errando que agente aprende kkkk e eu acho que esse código que vc postou a cima será muito importante para outras pessoas que estão aprendendo J2EE kkkk! vlw e até mais…(poxa é a segunda vez que eu mesmo respondo minha dúvida aqui kkkkkk).
Como colocar essa propriedade PASSWORD no JtextField ?
no netbeans, quando estamos criando algo com frames tem um jtext especificio para senha, (campo de senha) traduzido, mas não utilizei ele ainda e se não me engano ele traz por padrao apenas a “proteção” para a senha ou seja ele aceita número e letras e ate caracteres especias.