不断检查Java的变化?

时间:2010-04-30 10:34:59

标签: java methods boolean

如何检查布尔值以在给定的时间段内更改状态,如果在该时间段内进行了更改,请执行方法吗?

请用Java提供任何帮助。

感谢。

4 个答案:

答案 0 :(得分:15)

听起来你想在一个可以监听变化的类中包装一个布尔值。

class ObservableBoolean {

    // "CopyOnWrite" to avoid concurrent modification exceptions in loop below.
    private final List<ChangeListener> listeners =
            new CopyOnWriteArrayList<ChangeListener>();

    private boolean value;

    public boolean getValue() {
        return value;
    }

    public synchronized void setValue(boolean b) {
        value = b;
        for (ChangeListener cl : listeners)
            cl.stateChanged(new ChangeEvent(this));
    }

    public synchronized void addChangeListener(ChangeListener cl) {
        listeners.add(cl);
    }

    public synchronized void removeChangeListener(ChangeListener cl) {
        listeners.remove(cl);
    }
}

然后只需:

ObservableBoolean b = new ObservableBoolean();

//...

// Start the "period of time":
b.addChangeListener(iWantToBeNotifiedOfChanges);

// ...

// End the "period of time":
b.removeChangeListener(iWantToBeNotifiedOfChanges);

这实际上是MVC模式(和观察者模式)的简单情况。在这种情况下,模型是ObservableBoolean,视图将是想要通知更改的“视图”。

如果您想避免看起来很奇怪的ChangeListener导入

,您也可以编写自己的javax.swing...界面

答案 1 :(得分:6)

最简单的方法是使用包装类...

public class Bool
{
    public Bool(){ _val = false; }
    public Bool(boolean val) { _val = val; }

    public boolean getValue(){ return _val; }
    public void setValue(boolean val){ 
         _changesupport.firePropertyChange("value",_val,_val=val);
    }

    public void addPropertyChangeListener(PropertyChangeListener listener ){
        _changesupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener){
        _changesupport.removePropertyChangeListener( listener );
    }

    private boolean _val = false;
    private final PropertyChangeSupport _changesupport = new PropertyChangeSupport(this);
}

这是Swing中的常见模式,您可以使用PropertyChangeSupport来简化对象的创建,您可以在其上观察和侦听属性更改。使用此类,您可以注册PropertyChangeListener来处理生成的PropertyChangeEvent结果。

答案 2 :(得分:1)

使用Timer或编写自己的类Thread

使用Google搜索这些内容应该会给你一个良好的开端

编辑:从问题来看,目前还不清楚他的意图是什么。也许他想在确切的时间段内调用某种方法,而不是在事件发生后立即调用。对于这种模式,我仍然坚持使用计时器,或者编写我自己的Thread。编写自己的Thread仍然是解释特定用户需求的最佳方式。另一方面,如果真的是收听事件,我的Timer模式就完全错了。

示例:我想每5分钟更新一次数据库(想象一下Web浏览器游戏),如果用户请求的那样(reques = true)。使用false请求,我不需要更新数据库。立即更新数据库(例如游戏部落战争中的数据与玩家的thoushands)是完全矫枉过正的。

答案 3 :(得分:-2)

似乎你应该考虑实现某种Model View Controller Pattern。 看看here

基本思想是你应该在更改布尔值时触发一个事件,然后触发该事件,你的监听器应该处理它。