Come posso ottenere la lunghezza dei contenuti di un JTextField mentre l'utente digita?
-
03-07-2019 - |
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?
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());
}