gpt4 book ai didi

java - Swing 监视器未保存的更改

转载 作者:行者123 更新时间:2023-12-01 22:36:39 25 4
gpt4 key购买 nike

我开发了一个由 12 个 JPanel 组成的图形界面,每个 JPanel 包含 4 到 10 个 JTextFields。我想实现一个未保存更改警告,以防用户更改了某些 JTextField 的内容,但没有将更改提交到数据库。

如何实现这一目标?我的第一个想法是使用 ItemListener 并注册所有 JTextField。我可以为每个面板存储一个变量 boolean unsavedChanges 并检查所有面板是否均为 false。

你能想象另一种更有效的解决方案吗?

最佳答案

您有两个选择。

  1. 您可以在每个 JTextField 的文档上注册一个 DocumentListener。

    textField.getDocument().addDocumentListener(documentListener)

    缺点:即使用户已将值更改为原始值,文本字段也会标记为已更改。要解决此问题,您可以将原始值保存在您自己的文档监听器中,并将新值与其进行比较。 hasChanged() 方法为您提供所需的信息。

    import javax.swing.event.*;
    import javax.swing.text.*;

    public class DocumentChangeListener implements DocumentListener {

    private boolean changed;
    private final String originalValue;

    public DocumentChangeListener(String originalValue) {
    this.originalValue = originalValue;
    }

    protected void changed(DocumentEvent e) {
    if (e.getDocument() instanceof PlainDocument) {
    PlainDocument doc = ((PlainDocument)e.getDocument());
    try {
    String value = doc.getText(0, doc.getLength());
    changed = originalValue == null || !originalValue.equals(value);
    } catch(BadLocationException exc) {
    exc.printStackTrace();
    }
    }
    }

    public void changedUpdate(DocumentEvent e) {
    changed(e);
    }

    public boolean hasChanged() {
    return this.changed;
    }

    public void insertUpdate(DocumentEvent e) {
    changed(e);
    }

    public void removeUpdate(DocumentEvent e) {
    changed(e);
    }
    }
  2. 您可以将从数据库中获取的文本字段中显示的原始值保存在 map 或类似的内容中。当您检查面板时,您必须将文本字段的内容与原始值进行比较。

编辑

要收集每个文本字段的更改信息,您可以使用这样的类。您在框架中创建它的一个实例并将其传递给所有面板。

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

关于java - Swing 监视器未保存的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26779189/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com