Dies ist mein Code:Warum JTextField.setText DocumentUistener die removeUpdate() vor ÄnderungUpdate() ausgelöst wird?
insertUpdate from txt1
insertUpdate from txt2
Aber wenn ich die Taste erneut klicken, wird removeUpdate()
aufgerufen werden:
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Frame extends JFrame {
private JTextField txt1 = new JTextField(10);
private JTextField txt2 = new JTextField(10);
private JButton btn = new JButton("Set Text");
public Frame() {
super("Latihan");
setLayout(new FlowLayout());
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
txt1.setText("TEST"); txt2.setText("TEST2");
}
});
txt1.getDocument().addDocumentListener(new TheDocumentListener("txt1"));
txt2.getDocument().addDocumentListener(new TheDocumentListener("txt2"));
add(txt1);
add(txt2);
add(btn);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
public static void main (String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Frame();
}
});
}
}
class TheDocumentListener implements DocumentListener {
private String source;
public TheDocumentListener(String source) {
this.source = source;
}
@Override
public void insertUpdate(DocumentEvent e) {
System.out.println("insertUpdate from " + source);
}
@Override
public void removeUpdate(DocumentEvent e) {
System.out.println("removeUpdate from " + source);
}
@Override
public void changedUpdate(DocumentEvent e) {
System.out.println("changedUpdate from " + source);
}
}
Als ich zum ersten Mal auf der JButton klicken, wird nur insertUpdate()
wird aufgerufen, vor insertUpdate()
:
removeUpdate from txt1
insertUpdate from txt1
removeUpdate from txt2
insertUpdate from txt2
Ist das erwartete Verhalten oder etwas falsch in meinem Code?
Kann ich insertUpdate
die einzige Methode machen, die beim Ausführen von JTextField.setText
aufgerufen wurde? Ich möchte sicherstellen, removeUpdate
wird nur aufgerufen, wenn Benutzer Text im Textfeld löschen. Wie geht das?
Der Grund ist für die Simulation der JTextField-Bindung, da setText() nicht gebunden ist. Wenn es um gegenseitige Bindung geht, sollte es sein: Wechsel zu anderen gebundenen Eigenschaften wird zu JTextField.text propagiert; und der Aufruf von JTextField.text sollte an die gebundene Eigenschaft weitergegeben werden. Aber was jetzt wirklich passiert, ist der Wechsel zu JTextField.text wird manchmal 1 oder 2 Dokument Listener Ereignisse auslösen und es ist schwer zu entscheiden, wann die gegenseitige Bindung zu stoppen ist. – jocki