Domanda

JTextField ha un evento keyTyped ma sembra che al momento dello sparo il contenuto della cella non sia ancora cambiato.

Per questo motivo .length () è sempre sbagliato se letto qui.

Deve esserci un modo semplice per ottenere la lunghezza come appare all'utente dopo un colpo di chiave?

È stato utile?

Soluzione

Questo probabilmente non è il modo ottimale (ed è stato un po 'di tempo), ma in passato ho aggiunto un DocumentListener a JTextField e su uno qualsiasi degli eventi (inserire, aggiornare, rimuovere) I:

evt.getDocument().getLength()

Che restituisce la lunghezza totale del contenuto del campo di testo.

Altri suggerimenti

Ciò può essere correlato a questo " bug " (o meglio " funzione ")

  

Gli ascoltatori vengono informati degli eventi chiave prima di elaborarli   consentire agli ascoltatori di "rubare" gli eventi consumandoli. Questo da   compatibilità con la vecchia nozione di consumo degli eventi.
   Il " digitato "   evento non significa che è stato inserito del testo nel componente . Questo NON è un   bug, è comportamento previsto.

Una possibile soluzione è ascoltare un documento associato

// 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
}
});
  

Nota che funziona indipendentemente da come il testo viene modificato; tramite una clipboard taglia / incolla, progammatica "setText ()" su TextField o l'utente che digita nel campo sull'interfaccia utente.

KeyEvent sono eventi di basso livello che qui non sono appropriati [sembra familiare]

Come fa il sistema JTextField a sapere che è stato digitato un personaggio? Attraverso un evento digitato chiave (IIRC, eseguito tramite PL & amp; F). L'evento viene inviato al listener di sistema prima del listener? Potrebbe o non potrebbe esserlo.

In questo caso, probabilmente vorrai andare al Document e aggiungere un listener di livello superiore. Con Swing è una buona idea optare per il modello in anticipo: le interfacce di classe "J" sono incoerenti. Se stai intercettando i dati di input, probabilmente vuoi un modello personalizzato (o nel caso di Document un DocumentFilter ).

Usa questo codice:

public void jTextField6KeyReleased(java.awt.event.KeyEvent evt)
{
    System.out.println(jTextField6.getText().length());
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top