如何检查布尔值以在给定的时间段内更改状态,如果在该时间段内进行了更改,请执行方法吗?
请用Java提供任何帮助。
感谢。
答案 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
基本思想是你应该在更改布尔值时触发一个事件,然后触发该事件,你的监听器应该处理它。