【问题标题】:causing updates to SpinnerNumberModel even if the number is the same即使数字相同,也会导致 SpinnerNumberModel 更新
【发布时间】:2010-12-09 16:49:07
【问题描述】:

我有一个SpinnerNumberModel 和一些ChangeListeners。

但 ChangeListener 仅在微调器编号更改时才会收到通知。即使新的微调器编号与之前的值相同,是否有办法启动传播到 ChangeListeners 的事件?

【问题讨论】:

  • 为什么在没有发生变化的情况下调用变化监听器?
  • 因为我无法访问的其他事件导致模型可能与“现实”不同步,我想重新初始化模型并确保发生下游操作。 (实际上有一个 NaN 状态我不能使用,因为 SpinnerNumberModel 不支持它,尽管在下一个非 NaN 状态发生之前我无法检测到它。)
  • 不确定我是否完全理解:当你与现实同步时,这不正是发生变化和发送事件的关键吗?
  • My NumberModel 代表远程设备上的计数器。假设它是 10。有时远程设备的计数器会发生变化,而我无法检测到。但是我有一段时间(如前所述“与现实同步”)我仍然不知道远程设备的计数器,但我将它设置为一个值。如果该值为 10,即使 NumberModel 已经包含 10,我也想fireUpdate()(根据我的新实现)并使其传播到远程设备。

标签: java model-view-controller swing changelistener


【解决方案1】:

SpinnerNumberModel 使用以下方法向已注册的更改侦听器发送事件:

1. public void setValue(Object value)
2. public void setStepSize(Number stepSize)
3. public void setMaximum(Comparable maximum)
4. public void setMinimum(Comparable minimum)

在这些方法中,只有当作为参数传递的值实际上与当前值不同时才会发出事件。

但是,您可以编写自己的 SpinnerModel(例如,通过子类化 SpinnerNumberModel)并触发您想要的所有事件。如果您的实现继承自AbstractSpinnerModel,就像SpinnerNumberModel 一样,您将有一个方便的fireStateChanged 方法可用于发送事件:

http://download.oracle.com/javase/6/docs/api/javax/swing/AbstractSpinnerModel.html#fireStateChanged()

【讨论】:

    【解决方案2】:

    Thomas 击败了我,但我得出了相同的结论,这就是我最终要做的:

    private static class SpinnerNumberModel2 extends SpinnerNumberModel
    {
        public SpinnerNumberModel2(int value, int minimum, int maximum, int stepSize)
        {
            super(value,minimum,maximum,stepSize);
        }
        public void fireUpdate() { super.fireStateChanged(); }
    }   
    

    【讨论】:

    • 太棒了!请注意,您甚至不必使用不同的方法名称来公开 fireStateChanged()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2016-03-26
    相关资源
    最近更新 更多