Как я могу проверить на булевскую переменную для изменения состояния за установленный срок времени, и если изменение передано, что период времени выполняет метод?
Может любая справка быть данной в Java.
Спасибо.
Самый простой способ сделать это - использовать класс-оболочку ...
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 в результате.
Похоже, вы хотите обернуть логическое значение в класс, который вы можете прослушивать на предмет изменений.
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 ...
import
используйте Timer
или напишите свой собственный класс, расширяющий Thread
.
Гугление этих вещей должно дать вам хорошее начало
edit : Из вопроса не совсем ясно, каковы его намерения. Возможно, он хочет вызвать какой-то метод через определенный промежуток времени, а не сразу после события. Для этого паттерна я бы предпочел использовать таймер или написать свой собственный поток. Написание собственного потока - это все же лучший способ интерпретации специфических требований пользователя. С другой стороны, если это действительно случай прослушивания событий, то мой паттерн Timer будет совершенно неправильным.
пример: я хочу обновлять базу данных (представьте себе браузерную игру) каждые 5 минут, если пользователь попросит об этом (reques = true). При ложном запросе мне не нужно обновлять базу данных. Немедленное обновление базы данных (например, статистики в игре Tribal Wars с тысячами игроков) является абсолютным излишеством.
Похоже, вам следует реализовать своего рода шаблон контроллера представления модели
.
Посмотрите здесь
Основная идея состоит в том, что вы должны запускать событие, когда логическое значение изменяется, а затем это событие запускается, ваш слушатель должен это обработать.