¿Cómo puedo obtener la longitud de los contenidos de un JTextField a medida que el usuario escribe?
-
03-07-2019 - |
Pregunta
JTextField tiene un evento KeyTyped pero parece que en el momento en que se dispara el contenido de la celda aún no ha cambiado.
Debido a eso .length () siempre está mal si se lee aquí.
¿Debe haber una forma sencilla de obtener la longitud tal como aparece para el usuario después de presionar una tecla?
Solución
Probablemente esta no sea la forma óptima (y ha sido un tiempo), pero en el pasado, he agregado un DocumentListener al JTextField y en cualquiera de los eventos (insertar, actualizar, eliminar) I:
evt.getDocument().getLength()
Lo que devuelve la longitud total del contenido del campo de texto.
Otros consejos
Esto puede estar relacionado con este " bug " (o más bien, " característica ")
Los oyentes son notificados de los eventos clave antes de procesarlos para permitir a los oyentes " robar " Los eventos consumiéndolos. Esto da compatibilidad con la antigua noción awt de consumir eventos.
El " escrito " evento no significa que se ingresó texto en el componente . Esto no es una error, es el comportamiento previsto.
Una posible solución es escuchar un documento asociado
// Listen for changes in the text
myTextField.getDocument().addDocumentListener(new DocumentListener() {
public void changedUpdate(DocumentEvent e) {
// text was changed
}
public void removeUpdate(DocumentEvent e) {
// text was deleted
}
public void insertUpdate(DocumentEvent e) {
// text was inserted
}
});
Tenga en cuenta que esto funciona sin importar cómo se modifique el texto; a través de un portapapeles cortar / pegar, progamatic " setText () " en el campo de texto, o el usuario que escribe en el campo en la interfaz de usuario.
KeyEvent
son eventos de bajo nivel que no son apropiados aquí [eso suena familiar].
¿Cómo sabe el sistema JTextField
que se ha escrito un carácter? A través de un evento de tipo clave (IIRC, realizado a través de PL & amp; F). ¿Se envía el evento al oyente del sistema antes que a su oyente? Puede o no puede hacer.
En este caso, es probable que desee ir al Documento
y agregar un oyente de nivel superior. Con Swing es una buena idea optar por el modelo temprano, ya que las interfaces de la clase 'J' son incoherentes. Si está interceptando datos de entrada, es probable que desee un modelo personalizado (o en el caso de Document
un DocumentFilter
).
Usa este código:
public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
{
System.out.println(jTextField6.getText().length());
}