Постоянно проверяйте на изменение в Java?

Как я могу проверить на булевскую переменную для изменения состояния за установленный срок времени, и если изменение передано, что период времени выполняет метод?

Может любая справка быть данной в Java.

Спасибо.

5
задан user329671 30 April 2010 в 10:34
поделиться

4 ответа

Самый простой способ сделать это - использовать класс-оболочку ...

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 в результате.

6
ответ дан 18 December 2019 в 07:53
поделиться

Похоже, вы хотите обернуть логическое значение в класс, который вы можете прослушивать на предмет изменений.

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

15
ответ дан 18 December 2019 в 07:53
поделиться

используйте Timer или напишите свой собственный класс, расширяющий Thread.

Гугление этих вещей должно дать вам хорошее начало

edit : Из вопроса не совсем ясно, каковы его намерения. Возможно, он хочет вызвать какой-то метод через определенный промежуток времени, а не сразу после события. Для этого паттерна я бы предпочел использовать таймер или написать свой собственный поток. Написание собственного потока - это все же лучший способ интерпретации специфических требований пользователя. С другой стороны, если это действительно случай прослушивания событий, то мой паттерн Timer будет совершенно неправильным.

пример: я хочу обновлять базу данных (представьте себе браузерную игру) каждые 5 минут, если пользователь попросит об этом (reques = true). При ложном запросе мне не нужно обновлять базу данных. Немедленное обновление базы данных (например, статистики в игре Tribal Wars с тысячами игроков) является абсолютным излишеством.

1
ответ дан 18 December 2019 в 07:53
поделиться

Похоже, вам следует реализовать своего рода шаблон контроллера представления модели . Посмотрите здесь

Основная идея состоит в том, что вы должны запускать событие, когда логическое значение изменяется, а затем это событие запускается, ваш слушатель должен это обработать.

-2
ответ дан 18 December 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: