java-Swing:有没有办法区分用户引起的ItemEvent和应用程序引起的?

我正在使用基于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对象的提取必须在不同的线程中运行;).通常,请重新考虑应用程序的设计.

上一篇:WPF DataGridTemplateColumn组合框更新所有行


下一篇:C#中string.Substring 的用法