我正在使用基于Swing的应用程序中的组合框,并且很难确定如何区分用户事件生成的ItemEvent和应用程序导致的ItemEvent.
例如,假设我有一个组合框“ combo”,而我的ItemListener“ listener”正在监听itemStateChanged事件.当用户将选择更改为项目2或我执行该行(伪代码)时:
combo.setSelection(2)
..看来我无法分辨这些事件.
就是说,无论如何我都不是Swing专家,所以我想问一下.
谢谢!
解决方法:
动作和反应定律很清楚:).如果您尝试对更改做出反应,则无需区分用户和应用程序.我可以想象只有一个用例需要“区分”.应用程序正在显示一些数据的情况.在这种情况下,您可能拥有应用程序的数据模型.此外,此模型中还包含一些更改侦听器,应用程序GUI将通过为组件设置值来做出反应.并且.如果用户选择任何东西到GUI组件中.数据模型将通过更改值来做出反应.在这种情况下,很容易在数据模型上设置某种只读状态,该状态将通知模型忽略来自观察对象的任何事件.此通知集应在EDT中运行,并且标记没有问题.小例子:
class ApplicationDataModel {
private Flag current = Flag.RW;
public void setData(ApplicationData data) {
current = Flag.RO;
setDataImpl(data);
notifyObservers();
current = Flag.RW;
}
public void reaction(Event e) {
if (flag = Flag.RO) return;
...
}
}
标记时要小心,不要忘记线程.如果要从另一个线程调用setData,那么EDT就会麻烦.当然. ApplicationData对象的提取必须在不同的线程中运行;).通常,请重新考虑应用程序的设计.