¿Cómo puedo obtener la longitud de los contenidos de un JTextField a medida que el usuario escribe?

StackOverflow https://stackoverflow.com/questions/401598

  •  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?

¿Fue útil?

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.

Los

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());
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top