Vaadin:获取 UI 的引用以更改数据
Vaadin: get reference of UI to change data
我想更改 Vaadin 中的数据 UI。更改由休息调用调用。在那里,我不知何故需要引用 UI class 来调用它的方法,例如changeValue(字符串值).
我正在使用 vaadin-spring-boot-starter 1.0.0
这有可能吗?
编辑:现在另一个问题:
我试图在视图内部执行@Eric 提到的服务器推送,以便视图将在广播消息上得到更新。但是,这是行不通的(没有异常,没有要调试的,只是视图中没有更新)。这就是我在我的观点中所做的:
@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);
您正在寻找的是 Vaadin 的推送功能和一种向已注册 "clients" 列表发送消息的方法(在本例中,Vaadin UI 需要了解变化)。
您可以在此处阅读有关 Vaadin Push 的信息:Enabling Server Push and also in the article Advanced Push
Vaadin 推送功能允许您的服务器强制更新到客户端,而不是等待浏览器再次请求。
消息组件只是作为一种方式告诉订阅的 UIs 有更新需要他们采取行动。
这就是说,我有一个项目的功能与多个用户正在执行的项目大致相同,并且有 Spring 计划任务也会影响用户需要了解的更改。
请注意,以下示例基于 Enabling Server Push 文章中提供的示例。
Broadcaster.java - 充当注册实例以接收广播并提供发送广播的工具的机制。在下面的示例中,我有一个代表消息 (BroadcastMessage) 的 class,但您当然可以简化它。
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 定义的 class。我的想法是有一种方法来表示我有什么样的消息以及 Map
形式的一些有效负载
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
)
);
希望对您有所帮助! :)
我想更改 Vaadin 中的数据 UI。更改由休息调用调用。在那里,我不知何故需要引用 UI class 来调用它的方法,例如changeValue(字符串值).
我正在使用 vaadin-spring-boot-starter 1.0.0
这有可能吗?
编辑:现在另一个问题: 我试图在视图内部执行@Eric 提到的服务器推送,以便视图将在广播消息上得到更新。但是,这是行不通的(没有异常,没有要调试的,只是视图中没有更新)。这就是我在我的观点中所做的:
@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);
您正在寻找的是 Vaadin 的推送功能和一种向已注册 "clients" 列表发送消息的方法(在本例中,Vaadin UI 需要了解变化)。
您可以在此处阅读有关 Vaadin Push 的信息:Enabling Server Push and also in the article Advanced Push
Vaadin 推送功能允许您的服务器强制更新到客户端,而不是等待浏览器再次请求。
消息组件只是作为一种方式告诉订阅的 UIs 有更新需要他们采取行动。
这就是说,我有一个项目的功能与多个用户正在执行的项目大致相同,并且有 Spring 计划任务也会影响用户需要了解的更改。
请注意,以下示例基于 Enabling Server Push 文章中提供的示例。
Broadcaster.java - 充当注册实例以接收广播并提供发送广播的工具的机制。在下面的示例中,我有一个代表消息 (BroadcastMessage) 的 class,但您当然可以简化它。
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 定义的 class。我的想法是有一种方法来表示我有什么样的消息以及 Map
形式的一些有效负载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
)
);
希望对您有所帮助! :)