检测对表单控件中文本的所有更改(由用户进行)

Posted

技术标签:

【中文标题】检测对表单控件中文本的所有更改(由用户进行)【英文标题】:Detect all changes (made by the user) to the text in controls on the form 【发布时间】:2011-09-03 10:51:50 【问题描述】:

我有一个带有 Save() 方法的程序,它将所有数据保存在表单上的微调器和文本字段中。每次用户对文本字段或微调器进行更改时,有没有办法调用“Save()”?类似于通用事件处理程序的东西。

谢谢

【问题讨论】:

【参考方案1】:

您可以将ChangeListener 的单个实例连接到您的所有控件,这可能看起来像(当一个内部类时):

private class ListenerImpl implements ChangeListener 
   public void stateChanged(ChangeEvent e)  save(); 

要一次性添加此侦听器,您可以像这样循环 Container 的子代:

final ListenerImpl l = new ListenerImpl();
for (Component c : getComponents()) 
   if (c instanceof JSpinner) 
      ((JSpinner)c).addChangeListener(l);
    else if (c instanceof JTextPane )   // ... other types of components

您必须寻找不同类型的组件,因为没有定义addChangeListener(..) 方法的接口(我知道)。

【讨论】:

很好,但是有没有办法在 for each 循环中完成所有的 textifleds 和 spinners 而不是手动添加每个?我有大约 15 个,如果我这样做,代码会变得很长。【参考方案2】:

我建议您在表单中的每个控件中添加ChangeListenerFocusListener,并在其中一种回调方法中调用Save()。 (实际上,我可能会选择FocusListener 并通过focusLost 方法调用Save()。)

How to Write a Focus Listener

【讨论】:

有没有办法使用 for each 循环遍历表单上的每个微调器? (所以我可以为循环中的每个对象添加一个焦点侦听器,而不是手动执行)。 for (Component c:getComponents()) if (c instanceof Spinner) ((Spinner)c).addChangeListener(listener); 是的,这是可能的(虽然不确定这是“最佳实践”)。您可以使用Container.getComponents() 循环访问组件。像这样的东西:for (Component comp: form.getComponents()) if (comp instanceof JSpinner) comp.addFocusListener(yourListener);(或者addChangeListener(),如果你愿意的话。 谢谢 :) 我会 +1 你,但我仍然需要 15 个代表才能做到这一点:/

以上是关于检测对表单控件中文本的所有更改(由用户进行)的主要内容,如果未能解决你的问题,请参考以下文章

如何禁用表单上除按钮之外的所有控件?

当表单中的任何文本框发生更改时运行函数?微软访问

使用 jQuery 检测表单输入的自动完成

表单帖子不包含文本框数据 [ASP.NET C#]

访问表单:在文本框中捕获日期更改

更改应用程序中所有控件的字体大小(win 表单)