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

awi*_*ied 6 java events swing combobox listeners

我正在基于 Swing 的应用程序中使用组合框,我很难弄清楚如何区分由用户事件生成的 ItemEvent 与由应用程序引起的事件。

例如,假设我有一个组合框“ combo”,并且我正在使用我的 ItemListener“ listener”侦听 itemStateChanged 事件。当用户将选择更改为第 2 项或我执行该行(伪代码)时:

combo.setSelection(2)

.. 似乎我无法区分这些事件。

也就是说,我无论如何都不是 Swing 专家,所以我想我会问。

谢谢!

Ras*_*ara 2

作用和反应定律非常清楚:)。如果您尝试对更改做出反应,则无需区分用户和应用程序。我可以想象只有一个用例需要“区分”。应用程序显示一些数据的情况。在这种情况下,您可能拥有适用于您的应用程序的数据模型。该模型中还有一些更改侦听器,应用程序 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;
        ...
    }

}
Run Code Online (Sandbox Code Playgroud)

小心标记,不要忘记线程。如果您从另一个线程调用 setData,那么 EDT 就会遇到麻烦。当然。对象的提取ApplicationData必须在不同的线程中运行;)。一般来说,重新考虑应用程序的设计。