我是Vaadin的新手,正在编写一个WebSocket客户端,它与Android上的WebSocket服务器相连。
客户端在左侧生成所有电话联系人组的列表,每次单击该组后,客户端都会将关联的 contacst 加载到计算机屏幕的右侧。
到目前为止,一切都运行良好,除了加载的联系人在第一次单击它之后不会出现,而仅在第二次单击之后出现。 它始终加载在实际单击之前单击的组。 在调试器中,我可以看到正确的联系人已经加载到布局中,但它们仍然仅在下次单击后出现。 它始终显示"旧联系人",而不是通过当前单击创建的联系人。 一需要以某种方式强制布局刷新,但到目前为止没有成功
到目前为止,我找到的答案都没有帮助:既不使用setImmediate(true),也没有在conainer上使用,也不请求Repaint(true);
@Override
protected void init(VaadinRequest vaadinRequest) {
layoutMain = new HorizontalLayout();
setContent(layoutMain);
layoutLeft = new VerticalLayout();
layoutRight = new VerticalLayout();
layoutMain.addComponent(layoutLeft);
layoutMain.addComponent(layoutRight);
final Client client;
try {
client = new Client(new URI("ws://192.168.0.14:8080"));
Client.ClientListener clientListener = new Client.ClientListener() {
@Override
public void onOpen(ServerHandshake serverHandshake) {
short httpStatus = serverHandshake.getHttpStatus();
}
@Override
public void onMessage(String message) { // getting a json string with the data needed to fill the layout
try {
final JSONObject jsonObj = new JSONObject(message);
JsonHelper jsonHelper = new JsonHelper(jsonObj);
if (jsonHelper.isEvent("selectGroups")) {
JSONArray list = jsonHelper.getList();
for (int i = 0; i < list.length(); i++) {
JSONObject jsonGroup = (JSONObject) list.get(i);
final Button button = new Button(jsonGroup.getString("id") + ": " + jsonGroup.getString("name"));
button.setData(jsonGroup.getString("id"));
button.addClickListener(new Button.ClickListener() {
@Override
public void buttonClick(Button.ClickEvent clickEvent) {
try {
... // generate a json object to send to the server
client.send(jsonHelperClick.toString());
} catch (JSONException e) {
e.printStackTrace();
}
}
});
layoutLeft.addComponent(button); // adding the group as a button to the left side of the layout
}
// problem could be solved with push()
return;
}
if (jsonHelper.isEvent("availableContacts")) {
layoutRight.removeAllComponents();
JSONArray list = jsonHelper.getList(); // getting the list of all contacst from the phone
for (int i = 0; i < list.length(); i++) {
JSONObject jsonContact = (JSONObject) list.get(i);
HorizontalLayout rowContact = new HorizontalLayout();
... // filling the row representing the contact
layoutRight.addComponent(rowContact); // adding a contactrow to the right side of the layout
}
// problem could be solved with push()
// at this point i already see the right data added to layoutRight, but at the end still the old data is shown, not the new one
// layoutRight.requestRepaint(true);
// layoutRight.setImmediate(true);
// layoutRight.beforeClientResponse(true);
// layoutMain.requestRepaint(true);
// layoutMain.setImmediate(true);
//layoutMain.beforeClientResponse(true);
}
} catch (JSONException e) {
String message1 = e.getMessage();
e.printStackTrace();
}
}
};
client.setClientListener(clientListener);
client.connect();
} catch (URISyntaxException e) {
e.printStackTrace();
}
}
编辑:
<?xml version="1.0" encoding="UTF-8"?>
<web-app
id="WebApp_ID" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<servlet>
<servlet-name>VaadinApplicationServlet</servlet-name>
<servlet-class>
com.vaadin.server.VaadinServlet</servlet-class>
<init-param>
<param-name>UI</param-name>
<param-value>at.richardlederer.RemoteSms</param-value>
</init-param>
<!-- Enable server push -->
<init-param>
<param-name>pushmode</param-name>
<param-value>manual</param-value>
</init-param>
<async-supported>false</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>VaadinApplicationServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
编辑:我将推送模式更改为手动,以便仅在我校准 push() 方法时发生更改。
您需要在 vaadin 应用程序中启用服务器推送。
稍后将调用 onMessage 回调处理程序,当应用程序收到 JSON 数据时。然后,这将更新服务器端的 UI 状态。
当浏览器端的下一次交互完成时,然后,所有服务器端更新都将发送到浏览器。
启用它很简单:
@Push
public class PushyUI extends UI {
填充组件后调用方法push()解决了问题