Vaadin:在套接字请求后刷新内容



我是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()解决了问题

相关内容

  • 没有找到相关文章

最新更新