2016-09-16 2 views
0

Я хочу изменить данные внутри пользовательского интерфейса Vaadin. Это изменение вызвано вызовом отдыха. Там мне как-то нужна ссылка на класс пользовательского интерфейса, чтобы вызвать его метод », например. changeValue (строковое значение).Vaadin: получить ссылку UI для изменения данных

Я использую Vaadin-весну-загрузочный стартер 1.0.0

ли что-то можно?

EDIT: Еще один вопрос теперь: я пытался сделать, толкающие Server, упоминаемый @Eric, внутри View, так что вид будет обновляться на сообщение Broadcast. Однако это не работает (никаких исключений, ничего не отлаживать, просто нет обновлений в представлении). Это то, что я делаю, на мой взгляд:

@UIScope 
@SpringView(name = LoadWebsiteView.VIEW_NAME) 
@Push 
public class LoadWebsiteView extends VerticalLayout implements View, Broadcaster.BroadcastListener { 
... 

@Autowired 
public LoadWebsiteView(ScraperMainUI scraperMainUi) { 
    this.scraperMainUi = scraperMainUi; 
    Broadcaster.register(this); 
    initControlPane(); 
} 

@Override 
public void receiveBroadcast(String message) { 
    scraperMainUi.access(new Runnable() { 
     @Override 
     public void run() { 
      urlTxtField.setValue(message); 
     } 
    }); 
} 

и вот простые вещи я делать в restcontroller:

Broadcaster.broadcast(text); 
+1

Когда у вас есть 10 экземпляров пользовательского интерфейса, к какому из них вы хотите получить доступ?Вероятно, вам будет лучше с tome queue/broadcast system –

+0

ваше право, но я считаю, что это нормально, так как приложение будет частью пользовательской конфигурации программного обеспечения. Однако существуют ли возможности различать экземпляры пользовательского интерфейса, например, Я БЫ? – eSKape

ответ

2

Что вы ищете Нажмите особенность Vaadin и способ отправить сообщение в список зарегистрированных «клиентов» (в данном случае пользовательский интерфейс Vaadin, который должен знать об изменениях).

Вы можете прочитать о Vaadin Нажмите здесь: Enabling Server Push, а также в статье Advanced Push

Толчок функция Vaadin позволяет серверу, чтобы заставить обновления клиента, а не ждать в браузере, чтобы запросить снова.

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

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

Обратите внимание, что приведенные ниже примеры основаны на примерах, доступных в статье Enabling Server Push.

Broadcaster.java - Действует как механизм, который регистрирует экземпляры для приема широковещательных сообщений и предоставляет возможность отправлять трансляции. В приведенном ниже примере у меня есть класс, представляющий сообщение (BroadcastMessage), но вы можете его упростить.

public class Broadcaster implements Serializable { 

    private static final long serialVersionUID = 3540459607283346649L; 

    static ExecutorService executorService = Executors.newSingleThreadExecutor(); 

    private static LinkedList<BroadcastListener> listeners = new LinkedList<BroadcastListener>(); 

    public interface BroadcastListener { 
     void receiveBroadcast(BroadcastMessage message); 
    } 

    public static synchronized void register(BroadcastListener listener) { 
     listeners.add(listener); 
    } 

    public static synchronized void unregister(BroadcastListener listener) { 
     listeners.remove(listener); 
    } 

    public static synchronized void broadcast(final BroadcastMessage message) { 
     for (final BroadcastListener listener: listeners) 
      executorService.execute(new Runnable() { 
       @Override 
       public void run() { 
        listener.receiveBroadcast(message); 
       } 
      }); 
    } 
} 

Это класс, который я определил для своего BroadcastMessage. Идея заключается в том, чтобы иметь возможность обозначить, какие сообщения у меня есть, а также некоторая полезная нагрузка в виде карты

public class BroadcastMessage implements Serializable { 

    private static final long serialVersionUID = 5637577096751222106L; 

    public BroadcastMessageType messageType; 
    public Map<String, String> params; 

    public BroadcastMessage() { 
    } 

    public BroadcastMessage(BroadcastMessageType messageType) { 
     this.messageType = messageType; 
     this.params = new HashMap<String, String>(); 
    } 

    public BroadcastMessage(BroadcastMessageType messageType, Map<String, String> params) { 
     this.messageType = messageType; 
     this.params = params; 
    } 

    public BroadcastMessageType getMessageType() { 
     return messageType; 
    } 
    public void setMessageType(BroadcastMessageType messageType) { 
     this.messageType = messageType; 
    } 
    public Map<String, String> getParams() { 
     return params; 
    } 
    public void setParams(Map<String, String> params) { 
     this.params = params; 
    } 

} 

Это пример Vaadin UI, который хочет прослушивать передачи в эфир. Обратите внимание на аннотацию @Push. Без этого клиент будет обновляться только при выборе браузером. @Push делает его немедленным **

@SpringComponent 
@UIScope 
@Push 
@SpringView(name=TaskListComponent.NAME) 
public class TaskListComponent extends MyCustomComponent implements Broadcaster.BroadcastListener, View { 

    /** PRUNED DOWN, TO DEMONSTRATE THE KEY CODE **/ 

    // Register this window when we enter it 
    @Override 
    public void enter(ViewChangeEvent event) { 
     Broadcaster.register(this); 

    } 

    // Must also unregister when the UI expires  
    @Override 
    public void detach() { 
     Broadcaster.unregister(this); 
     super.detach(); 
    } 

    // Receive a broadcast 
    @Override 
    public void receiveBroadcast(BroadcastMessage message) { 

     getUI().access(new Runnable() { 
      @Override 
      public void run() { 
       // DO WHATEVER YOU NEED TO DO HERE. 
       // I CALLED INITIALIZE BUT IT COULD BE 
       // JUST YOU FIELD UPDATE 
       if (message.getMessageType().equals(BroadcastMessageType.REFRESH_TASK_LIST)) 
        initialize(); 
      } 
     }); 

    } 

} 

Для отправки сообщения через интерфейс отдыха:

Broadcaster.broadcast( 
    new BroadcastMessage( 
     BroadcastMessageType.AUTO_REFRESH_LIST 
    ) 
); 

Надеется, что это помогает! :)

+0

Отличный ответ Эрик! абсолютно идеальное решение. Единственное другое решение, которое я пробовал, было промежуточным хранилищем в БД или файле, так что остальной интерфейс сохранил там данные, а пользовательский интерфейс был опросом каждую секунду (setPollInterval (1000);) с помощью CustomPollListener. Но толкать его так, как вы описали, намного лучше! – eSKape

Смежные вопросы