Лучший способ постоянного обновления элементов графического интерфейса - PullRequest
0 голосов
/ 12 февраля 2009

У меня есть графический интерфейс Java, который имеет несколько текстовых полей, значения которых заполняются из статической переменной в другом классе.

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

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

Большое спасибо за ваши ответы заранее

Редактировать:

Дополнительные детали

  • Использование Swing
  • Обновления в идеале в реальном времени

Ответы [ 4 ]

3 голосов
/ 12 февраля 2009

На мой взгляд, разумным выбором является его реализация по шаблону Observer . Вы можете найти множество примеров по этой теме, например this

1 голос
/ 12 февраля 2009

Вы не упомянули, какой инструментарий вы использовали и какова архитектура вашего проекта.

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

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

0 голосов
/ 12 февраля 2009

Наблюдатель / Наблюдаемый с использованием слушателей. Вот с переменной экземпляра:

public class StaticVarClass {
    public static interface Listener {
        public void varChanged(Object oldVar, Object newVar);
    }

    private Object var;

    private List<Listener> listeners = new CopyOnWriteArrayList<Listener>();

    public void addListener(Listener l) { listeners.add(l); }
    public void removeListener(Listener l) { listeners.remove(l); }

    protected void fireVarChanged(Object oldVar, Object newVar) {
        for (listener : listeners) listener.varChanged(oldVar, newVar);
    }

    public void setVar(Object newVar) {
        fireVarChanged(var, var = newVar);
    }

Конечно, вы также можете использовать встроенный механизм PropertyChangeListener.

0 голосов
/ 12 февраля 2009

Самый простой способ - это сначала контролировать весь доступ к этой статической переменной. Сделайте его приватным и изменяемым только с помощью одного метода. Во-вторых, вызовите этот метод setText() во всех этих текстовых полях и установите для них новое значение.

Если значение этой переменной можно изменить вне потока диспетчеризации событий, тогда этот метод должен использовать SwingUtilities.invokeLater() для установки этих текстовых полей; компоненты должны быть доступны только EDT.

Если отображение каждого текстового поля вычисляется несколькими децентрализованными методами, то ваш метод установки переменных просто должен вызвать эти методы (возможно, в invokeLater(), как указано выше).

Если код изменения переменной не знает заранее, какие текстовые поля будут затронуты, тогда вам нужно разрешить объектам, контролирующим каждое текстовое поле, добавлять себя в код модификации в качестве слушателей. (Это проект MVC, который обычно считается хорошим.) Затем код модификации вызывает каждого слушателя в своем списке и сообщает ему, что значение изменилось.

...