Ich möchte, dass das Meldungsfeld sofort angezeigt wird, nachdem der Benutzer den Wert im Textfeld geändert hat. Derzeit muss ich die Eingabetaste drücken, damit das Meldungsfeld angezeigt wird. Stimmt etwas mit meinem Code nicht?
textField.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
if (Integer.parseInt(textField.getText())<=0){
JOptionPane.showMessageDialog(null,
"Error: Please enter number bigger than 0", "Error Message",
JOptionPane.ERROR_MESSAGE);
}
}
}
Jede Hilfe wäre dankbar!
java
swing
listener
jtextfield
documentlistener
user236501
quelle
quelle
Die übliche Antwort darauf lautet "benutze a
DocumentListener
". Ich finde diese Schnittstelle jedoch immer umständlich. Ehrlich gesagt ist die Schnittstelle überentwickelt. Es gibt drei Methoden zum Einfügen, Entfernen und Ersetzen von Text, wenn nur eine Methode erforderlich ist: Ersetzen. (Eine Einfügung kann als Ersatz für keinen Text durch Text angesehen werden, und ein Entfernen kann als Ersatz für Text ohne Text angesehen werden.)Normalerweise möchten Sie nur wissen, wann sich der Text in der Box geändert hat. In einer typischen
DocumentListener
Implementierung werden also drei Methoden verwendet, die eine Methode aufrufen.Aus diesem Grund habe ich die folgende Dienstprogrammmethode erstellt, mit der Sie eine einfachere
ChangeListener
als eine verwenden könnenDocumentListener
. (Es verwendet die Lambda-Syntax von Java 8, kann jedoch bei Bedarf an altes Java angepasst werden.)Anders als beim direkten Hinzufügen eines Listeners zum Dokument wird hiermit der (ungewöhnliche) Fall behandelt, dass Sie ein neues Dokumentobjekt auf einer Textkomponente installieren. Darüber hinaus wird das in der Antwort von Jean-Marc Astesana erwähnte Problem umgangen , bei dem das Dokument manchmal mehr Ereignisse auslöst , als es benötigt.
Auf jeden Fall können Sie mit dieser Methode lästigen Code ersetzen, der folgendermaßen aussieht:
Mit:
Code für die Öffentlichkeit freigegeben. Habe Spaß!
quelle
abstract class DocumentChangeListener implements DocumentListener
mit einer zusätzlichen abstrakten Methodechange(DocumentEvent e)
, die Sie von allen drei anderen Methoden aufrufen. Scheint mir offensichtlicher, da es mehr oder weniger die gleiche Logik wie dieabstract *Adapter
Zuhörer verwendet.changedUpdate
Methode wird explizit durch einen Aufruf in jedem voninsertUpdate
und aufgerufenremoveUpdate
, damit es funktioniert.Erstellen Sie einfach eine Schnittstelle, die DocumentListener erweitert und alle DocumentListener-Methoden implementiert:
und dann:
oder Sie können sogar den Lambda-Ausdruck verwenden:
quelle
Beachten Sie, dass der DocumentListener manchmal zwei Ereignisse empfangen kann, wenn der Benutzer das Feld ändert. Wenn der Benutzer beispielsweise den gesamten Feldinhalt auswählt und dann eine Taste drückt, erhalten Sie ein removeUpdate (der gesamte Inhalt wird entfernt) und ein insertUpdate. In Ihrem Fall denke ich nicht, dass es ein Problem ist, aber im Allgemeinen ist es das. Leider scheint es keine Möglichkeit zu geben, den Inhalt des textField zu verfolgen, ohne JTextField zu unterklassifizieren. Hier ist der Code einer Klasse, die eine "Text" -Eigenschaft bereitstellt:
quelle
Ich weiß, dass dies ein wirklich altes Problem ist, aber es hat mir auch einige Probleme verursacht. Als Kleopatra oben in einem Kommentar antwortete, löste ich das Problem mit a
JFormattedTextField
. Die Lösung erfordert jedoch etwas mehr Arbeit, ist aber ordentlicher.Das
JFormattedTextField
löst standardmäßig keine Eigenschaftsänderung aus, nachdem sich jeder Text im Feld geändert hat. Der Standardkonstruktor von erstelltJFormattedTextField
keinen Formatierer.Um jedoch das zu tun, was das OP vorgeschlagen hat, müssen Sie einen Formatierer verwenden, der die
commitEdit()
Methode nach jeder gültigen Bearbeitung des Felds aufruft . DiecommitEdit()
Methode löst die Eigenschaftsänderung von dem aus, was ich sehen kann, und ohne den Formatierer wird dies standardmäßig bei einer Fokusänderung oder beim Drücken der Eingabetaste ausgelöst.Weitere Informationen finden Sie unter http://docs.oracle.com/javase/tutorial/uiswing/components/formattedtextfield.html#value .
Erstellen Sie ein Standardobjekt formatter (
DefaultFormatter
), dasJFormattedTextField
entweder über seinen Konstruktor oder eine Setter-Methode an das Objekt übergeben werden soll . Eine Methode des Standardformatierers istsetCommitsOnValidEdit(boolean commit)
das Festlegen des Formatierers zum Auslösen descommitEdit()
Methode jedes Mal , wenn der Text geändert wird. Dies kann dann mit aPropertyChangeListener
und derpropertyChange()
Methode aufgenommen werden.quelle
Aber ich würde nicht einfach alles analysieren, was der Benutzer (möglicherweise aus Versehen) auf seiner Tastatur berührt
Integer
. Sie sollten alleException
geworfenen s fangen und sicherstellen, dass dieJTextField
nicht leer sind.quelle
Wenn wir die ausführbare Methode SwingUtilities.invokeLater () verwenden, während die Document Listener-Anwendung verwendet wird, bleibt sie manchmal hängen und benötigt Zeit, um das Ergebnis zu aktualisieren (gemäß meinem Experiment). Stattdessen können wir das KeyReleased-Ereignis auch für den hier erwähnten Listener zum Ändern von Textfeldern verwenden .
quelle
Es war die Update-Version von Codemwnci. Sein Code ist ganz in Ordnung und funktioniert bis auf die Fehlermeldung hervorragend. Um Fehler zu vermeiden, müssen Sie die Bedingungsanweisung ändern.
quelle
Sie können sogar "MouseExited" zur Steuerung verwenden. Beispiel:
quelle
Ich bin brandneu in WindowBuilder und komme nach ein paar Jahren wieder zu Java, aber ich habe "etwas" implementiert, dann dachte ich, ich würde es nachschlagen und bin auf diesen Thread gestoßen.
Ich bin gerade dabei, dies zu testen. Da ich neu in all dem bin, bin ich mir sicher, dass mir etwas fehlen muss.
Folgendes habe ich getan, wobei "runTxt" ein Textfeld und "runName" ein Datenelement der Klasse ist:
Scheint viel einfacher zu sein als das, was bisher hier ist, und scheint zu funktionieren, aber da ich gerade dabei bin, dies zu schreiben, würde ich es begrüßen, von übersehenen Fallstricken zu hören. Ist es ein Problem, dass der Benutzer das Textfeld betreten und verlassen kann, ohne eine Änderung vorzunehmen? Ich denke, alles, was Sie getan haben, ist eine unnötige Aufgabe.
quelle
Verwenden Sie einen KeyListener (der bei einem beliebigen Schlüssel ausgelöst wird) anstelle des ActionListener (der bei der Eingabe ausgelöst wird).
quelle
field.getText()
der Anfangswert zurückgegeben wird. und das Ereignis (arg0.getKeyChar()
) gibt die Taste zurück. Eine Fehlerprüfung ist erforderlich, um festzustellen, ob Sie mit Feldtext verketten sollten.DocumentFilter ? Es gibt Ihnen die Möglichkeit zu manipulieren.
[ http://www.java2s.com/Tutorial/Java/0240__Swing/FormatJTextFieldstexttouppercase.htm ]
Es tut uns leid. Ich benutze Jython (Python in Java) - aber leicht zu verstehen
quelle