Procurei aqui mas não achei então vou perguntar:
Tem algum método prático para só permitir números em um JTextField?
Já aproveitando, alguém sabe algum link direto para baixar o Driver (.JAR) do FireBird e o para BD do Access( :? ).
Value.
Procurei aqui mas não achei então vou perguntar:
Tem algum método prático para só permitir números em um JTextField?
Já aproveitando, alguém sabe algum link direto para baixar o Driver (.JAR) do FireBird e o para BD do Access( :? ).
Value.
Brother, ao invés de você instanciar o JTextField, utilize a classe LimitedIntegerJTextField (em anexo) que além de permitir apenas números, ainda pode-se definir o maxlength do campo.
Qualquer dúvida estamos por aqui.
Abraço.
eu fiz esse metodo
public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, “Esse Campo só aceita números” ,“Informação”,JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}
ai vc chama o metodo passando como parametro o JTextField
Valeu!
zizegaitero , nao consegui rodar o teu codigo no meu …
ai vai …
//package br.com.patterns.chain;
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JTextField;
import java.awt.Rectangle;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import javax.swing.JButton;
import javax.swing.event.CaretListener;
import javax.swing.event.CaretEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class Frame1 extends JFrame
{
private JTextField jTextField1 = new JTextField();
public Frame1()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
jTextField1.setText("jTextField1");
jTextField1.setBounds(new Rectangle(15, 35, 165, 20));
this.getContentPane().add(jTextField1, null);
}
public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, "Esse Campo só aceita números" ,"Informação",JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}
public static void main(String args[])
{
new Frame1().show();
}
}
vc pode usar no momento que sai o foco do campo.
vc chama o método passando como parametro o nome do campo
ex: ValidaNumero(Campo);
vlw
Cara faz uma annotation que verifica isso, o codigo fica bem mais fácil assim…
É sempre melhor impedir que o usuário faça errado a abrir uma caixa de diálogo na cara dele depois que ele errou.
Uma solução adequada é esta:
public class NumberField extends JTextField {
public NumberField() {
this( null );
}
public NumberField( String text ) {
super( text );
setDocument( new PlainDocument() {
@Override
public void insertString( int offs, String str, AttributeSet a ) throws BadLocationException {
//normalmente apenas uma letra é inserida por vez,
//mas fazendo assim também previne caaso o usuário
//cole algum texto
for( int i = 0; i < str.length(); i++ )
if( Character.isDigit( str.charAt( i ) ) == false )
return;
super.insertString( offs, str, a );
}
} );
}
}
Ola, amigo … me desculpe a pergunta mas, como devo utilizar essa classe ?? tipo igual a classe JtextFieldLimited … tfNomeFantasia.setDocument(new jTextFieldLimit(60)); ??? ou como devo fazer ???
[quote=Filipe Sabella]É sempre melhor impedir que o usuário faça errado a abrir uma caixa de diálogo na cara dele depois que ele errou.
Uma solução adequada é esta:
[code]
public class NumberField extends JTextField {
public NumberField() {
this( null );
}
public NumberField( String text ) {
super( text );
setDocument( new PlainDocument() {
@Override
public void insertString( int offs, String str, AttributeSet a ) throws BadLocationException {
//normalmente apenas uma letra é inserida por vez,
//mas fazendo assim também previne caaso o usuário
//cole algum texto
for( int i = 0; i < str.length(); i++ )
if( Character.isDigit( str.charAt( i ) ) == false )
return;
super.insertString( offs, str, a );
}
} );
}
}
[/code][/quote]
Eu faria assim:
MaskFormatter fmt = null;
try{
fmt = new MaskFormatter("##########");
}catch(ParseException e){}
JFormattedTextField tft2 = new JFormattedTextField(fmt);
http://www.exampledepot.com/egs/javax.swing.text/formtext_FormTextNum.html
[quote=zizegaitero]eu fiz esse metodo
public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, “Esse Campo só aceita números” ,“Informação”,JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}
ai vc chama o metodo passando como parametro o JTextField[/quote]
Valeu zizegaitero! Deu certinho para minha necessidade… Muito obrigado mesmo. Os créditos serão dados.
[quote=daniel.pedro_fernandes][quote=zizegaitero]eu fiz esse metodo
public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, “Esse Campo só aceita números” ,“Informação”,JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}
ai vc chama o metodo passando como parametro o JTextField[/quote]
Valeu zizegaitero! Deu certinho para minha necessidade… Muito obrigado mesmo. Os créditos serão dados.[/quote]
Também consegui segue abaixo:
//Coloquei o método na minha classe Utilitaria
public static void validaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0) {
try {
valor = Long.parseLong(Numero.getText());
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(null, “Esse Campo só aceita números”, “Informação”, JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();// foca o campo
Numero.setText(""); //limpa o campo
}
}
}
//Quando perde o foco passo JTextField
private void bankCodFieldFocusLost(java.awt.event.FocusEvent evt) {
JTextField field = (JTextField) evt.getComponent();
Utilitaria.validaNumero(field);
}
Espero que ajude mais pessoas, com esse exemplo!
Respondendo ai , um que funciona para quem precisar
package vini.util;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.PlainDocument;
public class NumberField extends JTextField {
/**
*
*/
private static final long serialVersionUID = 1L;
public NumberField(int cols) {
super(cols);
}
protected Document createDefaultModel() {
return new NumberDocument();
}
static class NumberDocument extends PlainDocument {
/**
*
*/
private static final long serialVersionUID = 1L;
public void insertString(int offs, String str, AttributeSet a)
throws BadLocationException {
if (str == null) {
return;
}
for (int i = 0; i < str.length(); i++) {
if(Character.isDigit(str.charAt(i))== false){
return;
}
}
super.insertString(offs, new String(str), a);
}
}
}
galera o tópico é meio antigo, só que vim procurar isso e não achei uma resposta fácil por aqui.
mas juntanto umas 2 idéias achei um jeito muito simples, e faz essa verificação em tempo real, eis o código:
fieldNumero.addKeyListener(new java.awt.event.KeyAdapter() { // cria um listener ouvinte de digitação do fieldNumero
public void keyReleased(java.awt.event.KeyEvent evt) { // cria um ouvinte para cada tecla pressionada
fieldNumero.setText(fieldNumero.getText().replaceAll("[^0-9]", "")); // faz com que pegue o texto a cada tecla digitada, e substituir tudo que não(^) seja numero por ""
}
});
para substituir para que só fiquem letras, basta alterar no replaceAll:
fieldNumero.setText(fieldNumero.getText().replaceAll("[^A-Z | ^a-z]", ""));
espero que tenha sido util, um abraço a todos.
[quote=brenowbc]galera o tópico é meio antigo, só que vim procurar isso e não achei uma resposta fácil por aqui.
mas juntanto umas 2 idéias achei um jeito muito simples, e faz essa verificação em tempo real, eis o código[/quote]
Simples, mas infelizmente furado. Não use eventos para tratar entradas de teclas em componentes, pois em 90% das vezes, eles não são multiplataforma e eles escondem problemas.
Por exemplo, seu código falha se o usuário der CTRL+C num texto, e cola-lo no JTextField com o mouse (não haverá keypress nesse caso).
A forma correta de limitar um JTextField é através do objeto Document relacionado a ele. Eis aqui uma classe que limita o JTextField só a números, e limita também a quantidade máxima de dígitos dele:
E aqui está o artigo que explica como um Document funciona:
http://www.guj.com.br/articles/29
E aqui um artigo falando de Document, DocumentFilter e outros recursos:
http://download.oracle.com/javase/tutorial/uiswing/components/generaltext.html
[quote=marcoscorso]zizegaitero , nao consegui rodar o teu codigo no meu …
ai vai …
//package br.com.patterns.chain;
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JTextField;
import java.awt.Rectangle;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import javax.swing.JButton;
import javax.swing.event.CaretListener;
import javax.swing.event.CaretEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class Frame1 extends JFrame
{
private JTextField jTextField1 = new JTextField();
public Frame1()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
jTextField1.setText("jTextField1");
jTextField1.setBounds(new Rectangle(15, 35, 165, 20));
this.getContentPane().add(jTextField1, null);
}
public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, "Esse Campo só aceita números" ,"Informação",JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}
public static void main(String args[])
{
new Frame1().show();
}
}
é melhor fazer isso pra entender melhor o codigo.
[/quote]
Eu só coloquei melhor pra entender!
//package br.com.patterns.chain;
import javax.swing.JFrame;
import java.awt.Dimension;
import javax.swing.JTextField;
import java.awt.Rectangle;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import javax.swing.JButton;
import javax.swing.event.CaretListener;
import javax.swing.event.CaretEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import javax.swing.*;
public class Frame1 extends JFrame
{
private JTextField jTextField1 = new JTextField();
public Frame1()
{
try
{
jbInit();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private void jbInit() throws Exception
{
this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
jTextField1.setText("jTextField1");
jTextField1.setBounds(new Rectangle(15, 35, 165, 20));
this.getContentPane().add(jTextField1, null);
}
public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, "Esse Campo só aceita números" ,"Informação",JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}
public static void main(String args[])
{
new Frame1().show();
}
}
no meu despertador uso um try catch, da para olhar o código, lá no final do tópico , ±
tá aqui o link ± certo, tem que retroceder um pouquinho, tem o despertador jar e o código abaixo,
mas para funcionar, não esqueça de pegar o som, bem no inicio do tópico, que ainda precisa ir no diretorio c://
[quote=zizegaitero]eu fiz esse metodo
public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, “Esse Campo só aceita números” ,“Informação”,JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}
ai vc chama o metodo passando como parametro o JTextField[/quote]
Só pra entender o código!
public void ValidaNumero(JTextField Numero) {
long valor;
if (Numero.getText().length() != 0){
try {
valor = Long.parseLong(Numero.getText());
}catch(NumberFormatException ex){
JOptionPane.showMessageDialog(null, "Esse Campo só aceita números" ,"Informação",JOptionPane.INFORMATION_MESSAGE);
Numero.grabFocus();
}
}
}
Pegando carona na dúvida do colega, utilizei a seguinte validação para esse problema:
String cnpj = jTextField10.getText();
if (cnpj.length() == 14) {
for (int i = 0; i < cnpj.length(); i++) {
if (Character.isDigit(cnpj.charAt(i))) {
System.out.println("numero: "+cnpj.charAt(i));
//return;
} else {
System.out.println("letra: "+cnpj.charAt(i));
JOptionPane.showMessageDialog(null, "Digite somente números", "CNPJ do cliente", JOptionPane.INFORMATION_MESSAGE);
// jTextField10.setFocusable(true);
return;
}
}
}else{
JOptionPane.showMessageDialog(null, "Numeração inválida", "CNPJ do cliente", JOptionPane.INFORMATION_MESSAGE);
}
Apesar dessa validação exibir as mensagens corretamente, continuo tendo um problema onde o usuario pode continuar o cadastro sem nenhum impedimento. Como posso manter o focu no campo até que o usuario digite corretamente as informações e ainda, qual opinião de vocês no que diz respeito a memoria, processamento e segurança para as demais soluções?