【发布时间】:2011-02-14 04:34:13
【问题描述】:
如何检查布尔值以在给定时间段内更改状态,如果在该时间段内进行更改,则执行方法?
请用Java提供任何帮助。
谢谢。
【问题讨论】:
如何检查布尔值以在给定时间段内更改状态,如果在该时间段内进行更改,则执行方法?
请用Java提供任何帮助。
谢谢。
【问题讨论】:
听起来你想在一个可以监听变化的类中包装一个布尔值。
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,视图将是希望收到更改通知的“视图”。
如果你想避免看起来很奇怪的javax.swing...导入,你也可以编写自己的ChangeListener接口
【讨论】:
PropertyChangeListener,但同样的区别。有没有办法避免编写addChangeListener 和removeChangeListener 方法?另外,这不能参数化(不是boolean,而是Boolean)?
最简单的方法是使用包装类...
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 来处理生成的PropertyChangeEvents 该结果。
【讨论】:
PropertyChangeSupport。为什么它不位于更“通用”的包中?
使用Timer 或编写您自己的扩展Thread 的类。
谷歌搜索这些东西应该会给你一个好的开始
编辑:从问题来看,他的意图不是很清楚。也许他想在确切的时间段内调用某个方法,而不是在事件发生后立即调用。对于这种模式,我还是宁愿坚持使用定时器,或者编写自己的线程。编写自己的线程仍然是解释特定用户需求的最佳方式。另一方面,如果这真的是监听事件的情况,我的 Timer 模式将是完全错误的。
示例:如果用户请求(reques = true),我想每 5 分钟更新一次数据库(想象网络浏览器游戏)。使用错误请求,我不需要更新数据库。立即更新数据库(例如游戏《部落战争》中拥有数千名玩家的统计数据)完全是矫枉过正。
【讨论】:
stateHasChanged 来跟踪这一点(否则很可能变化未被注意到)。
似乎您应该寻求实现某种Model View Controller Pattern。
看看here
基本思想是当布尔值改变时你应该触发一个事件,然后那个事件被触发,你的监听器应该处理它。
【讨论】: