我开发了一个由12个JPanels组成的图形界面,每个界面都包含4到10个 JTextFields。,我想实现一个,以防用户更改了某些JTextFields的内容,但没有将更改提交到数据库。
如何做到这一点?我的第一个想法是使用ItemListener并注册所有JTextFields。我可以为每个面板存储一个变量boolean ,并检查所有面板是否为false。
你能想象另一个更有效的解决方案吗?
发布于 2014-11-06 16:04:25
你有两个选择。
textField.getDocument().addDocumentListener(documentListener)
缺点:即使用户将值更改为原始值,也会将文本字段标记为已更改。要处理此问题,可以将原始值保存在自己的文档侦听器中,并将新值与其进行比较。hasChanged()方法为您提供了想要的信息。
导入javax.swing.Ev.*;导入javax.swing.text.*;公共类DocumentChangeListener实现DocumentListener {私有布尔值更改;私有最终字符串originalValue;公共DocumentChangeListener(字符串originalValue) { this.originalValue = originalValue;}受保护的void (DocumentEvent e) { if (e.getDocument() instanceof PlainDocument) { PlainDocument doc = ((PlainDocument)e.getDocument());尝试{ String value = doc.getText(0,doc.getLength());changed = originalValue == null DocumentEvent!originalValue.equals(值);} catch(BadLocationException exc) { exc.printStackTrace();}}公共void (DocumentEvent e) { changed(e);}公共布尔hasChanged() {返回this.changed;}公共空insertUpdate(DocumentEvent e) { changed( e);} public void removeUpdate(DocumentEvent E){ changed(e);}}编辑
要收集每个文本字段的更改信息,可以使用这样的类。在框架中创建它的一个实例,并将其传递给所有面板。
import java.util.*;
import javax.swing.text.*;
public class ChangeManager {
private final Collection<DocumentChangeListener> listeners;
public ChangeManager() {
listeners = new HashSet<>();
}
public boolean hasChanged() {
for(DocumentChangeListener listener : listeners) {
if(listener.hasChanged()) {
return true;
}
}
return false;
}
public void register(JTextComponent textComponent, String originalValue) {
DocumentChangeListener listener = new DocumentChangeListener(
originalValue);
textComponent.getDocument().addDocumentListener(listener);
listeners.add(listener);
}
}https://stackoverflow.com/questions/26779189
复制相似问题