Foro sobre Java SE > JTextField que solo acepte números
Ya existe el JFormattedTextField para estos casos.
Sigue un test que no usa KeyListener y que no acepta copiar y pegar texto.
/** Creates new form NewJFrame */
public NewJFrame() {
initComponents();
}
/** This method is called from within the constructor to
initialize the form.
WARNING: Do NOT modify this code. The content of this method is
always regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
NumberFormatter numberFormatter = new NumberFormatter(NumberFormat.getIntegerInstance());
numberFormatter.setValueClass(Long.class);
numberFormatter.setAllowsInvalid(false);
numberFormatter.setMinimum(0l);
jFormattedTextField1 = new javax.swing.JFormattedTextField(numberFormatter);
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
jFormattedTextField1.setVerifyInputWhenFocusTarget(false);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jFormattedTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 380, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jFormattedTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pack();
}// </editor-fold>
/**
@param args the command line arguments
*/
public static void main(String args[]) {
/* Create and display the form */
invokeLater(() -> {
new NewJFrame().setVisible(true);
});
}
// Variables declaration - do not modify
private javax.swing.JFormattedTextField jFormattedTextField1;
// End of variables declaration
}
Hola, Yo lo hice asi, en el evento keyTyped del TextField y me funciona
private void JTFdniKeyTyped(java.awt.event.KeyEvent evt) {
// PERMITE QUE SOLO SE ACEPTEN NUMEROS Y DE HASTA 20 DIGITOS, CADA VEZ QUE SE TIPEA EN ESTE TEXTFIELD
if(!Character.isDigit(evt.getKeyChar()) && !Character.isISOControl(evt.getKeyChar()))
{
Toolkit.getDefaultToolkit().beep();
evt.consume();
}
int k = (int) evt.getKeyChar();
if (JTFdni.getText().length() >= 20) {
evt.setKeyChar((char) KeyEvent.VK_CLEAR);//Limpiar el caracter ingresado
JOptionPane.showMessageDialog(null, "Ha excedido el número máximo de caracteres!!! (20)", "Validando Datos",
JOptionPane.ERROR_MESSAGE);
}
}
saludos
@latinjava
El problema principal con los keylisteners es que no impiden "Copiar y Pegar".
La única manera de verificar los datos con seguridad, si se emplean keylisteners, es usar un InputVerifier, que solo se activa al terminar la edición.
Aparte de todo, es mejor usar keyBindings:
http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html
"An alternative to key bindings is using key listeners. Key listeners have their place as a low-level interface to keyboard input, but for responding to individual keys key bindings are more appropriate and tend to result in more easily maintained code. Key listeners are also difficult if the key binding is to be active when the component doesn't have focus. Some of the advantages of key bindings are they're somewhat self documenting, take the containment hierarchy into account, encourage reusable chunks of code (Action objects), and allow actions to be easily removed, customized, or shared. Also, they make it easy to change the key to which an action is bound. Another advantage of Actions is that they have an enabled state which provides an easy way to disable the action without having to track which component it is attached to."
Si, no me di cuenta de eso, gracias por tu aclaracion.
Yo lo aplique asi, porque lo que me piden por ahora, es solamente que se ingresen numeros, y nada mas .
Gracias
hola estoy haciendo un programa donde tengo que en un jtextfield leer solo numeros ya casi lo tengo pero quiero evitar cuando copien un texto de otr lugar y lo peguen en el jtextfield aca les dejo el code a ver si me puede ayudar
JTextField textField = new JTextField(10);
textField.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
char caracter = e.getKeyChar();
// Verificar si la tecla pulsada no es un digito
if (((caracter < '0') || (caracter > '9')) && (caracter != '\b' /*corresponde a BACK_SPACE*/)) {
e.consume(); // ignorar el evento de teclado
}
}
});