检测对表单控件中文本的所有更改(由用户进行)
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】:我建议您在表单中的每个控件中添加ChangeListener
或FocusListener
,并在其中一种回调方法中调用Save()
。 (实际上,我可能会选择FocusListener
并通过focusLost
方法调用Save()
。)
【讨论】:
有没有办法使用 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 个代表才能做到这一点:/以上是关于检测对表单控件中文本的所有更改(由用户进行)的主要内容,如果未能解决你的问题,请参考以下文章