Vaadin TextArea outdated

时间:2018-01-25 16:18:57

标签: java vaadin

I receive from the TextArea always the same value after event trigger, If I change the value before pushing the send Button it’s working correctly, after pushing the Button it stuck on the last value I’ve set.

VaadinUI:

    @Override
    public void init(VaadinRequest request) {
…
// build json mock data layout structure and connect field to processo            jsonRequestTextArea.setValue(mockJsonData);
    HorizontalLayout mainLayout = new HorizontalLayout(jsonRequestTextArea, actions);
    processor.setJsonRequesttextArea(jsonRequestTextArea);
      // add listener for process button
      sendRequestButton.addClickListener(e -> processor.processRequest());

}

Processor:

public void processRequest() {

    …

    // set json content paramenter
    parametersMap.add(":contentFile", jsonRequesttextArea.getValue());
  }

I followed the example found on this Site Code can be clone from git:

git clone https://github.com/spring-guides/gs-crud-with-vaadin.git

Is there a way to always get the last updated text from the TextArea?

1 个答案:

答案 0 :(得分:1)

没问题

通过调用“getValue”获取TextArea对象的当前内容时,我认为没有问题。

以下是Vaadin 8.3.0中的完整示例应用程序。每次单击该按钮时,TextArea的内容前缀为文本“:contentFile”加上UTC中的当前日期时间。所以每次点击都会得到值,并设置一个新值;每次都没有问题。

package com.basilbourque;

import javax.servlet.annotation.WebServlet;

import com.vaadin.annotations.Theme;
import com.vaadin.annotations.VaadinServletConfiguration;
import com.vaadin.server.VaadinRequest;
import com.vaadin.server.VaadinServlet;
import com.vaadin.ui.*;

import java.time.Instant;

/**
 * Testing retrieval of contents from a TextArea.
 * <p>
 * See: https://stackoverflow.com/q/48447476/642706
 * <p>
 * By Basil Bourque.
 */
@Theme ( "mytheme" )
public class MyUI extends UI
{
    static final long serialVersionUID = 42L;

    @Override
    protected void init ( VaadinRequest vaadinRequest )
    {
        // Init layout.
        final VerticalLayout layout = new VerticalLayout();
        layout.setHeight( 100 , Unit.PERCENTAGE );

        // Widgets
        TextArea textArea = new TextArea( "TextArea" );
        textArea.setWidth( 100F , Unit.PERCENTAGE );
        textArea.setHeight( 100F , Unit.PERCENTAGE );
        String mode = textArea.getValueChangeMode().toString();  // `ValueChangeMode` enum. https://vaadin.com/download/release/8.3/8.3.0/docs/api/com/vaadin/shared/ui/ValueChangeMode.html
        textArea.setValue( "ValueChangeMode: " + mode );

        Button processButton = new Button( "Process" );
        processButton.addClickListener( clickEvent ->
        {
            String x = ":contentFile=" + Instant.now() + "\n" + textArea.getValue();
            textArea.setValue( x );
            textArea.setCursorPosition( 0 ); // Move insertion-point to top of the field for easy data-entry.
        } );

        // Arrange layout.
        layout.addComponents( textArea , processButton );
        setContent( layout );
    }

    @WebServlet ( urlPatterns = "/*", name = "MyUIServlet", asyncSupported = true )
    @VaadinServletConfiguration ( ui = MyUI.class, productionMode = false )
    public static class MyUIServlet extends VaadinServlet
    {
        static final long serialVersionUID = 42L;
    }
}

screenshot of example app

猜想

你的问题写得不清楚,缺乏足够的细节和信息。但看起来您看到TextArea的价值变化出现延迟。

我怀疑您可能正在从其他线程访问TextArea的值。

如果是这样,您必须记住,(a)用户在Web浏览器客户端中键入文本作为数据条目,以及(b)到达服务器端的键入文本之间可能存在延迟存储在实际小部件的状态中。

你的Vaadin应用程序确实存在于Java服务器上,它使用HTML,CSS,JavaScript等由Web浏览器中的Vaadin框架客户端自动远程呈现UI。客户端框架接受用户的输入和将其自动传递回服务器端以存储在Java对象(TextArea实例)中。

但是,用户输入时服务器端对象的更新频率是多少?涉及多少延迟?这取决于您使用方法ValueChangeModeTextArea::setValueChangeMode指定的TextArea::getValueChangeMode。常量BLUREAGERLAZYTIMEOUT各自规定了不同的时间。默认值为LAZY,记录为:

  

在每个用户事件上,在定义的时间间隔后安排服务器端事件,取消当前安排的事件(如果有)。例如,如果你想在发送事件之前等待用户输入的一小段时间,这是一个不错的选择。

要加快向服务器端传送用户输入,请将模式更改为EAGER,以便在每次按键时更新。但这会增加网络流量,使你的应用程序更加“健谈”。不好的互联网连接不好,但在本地网络上也许不错。

要将用户输入更频繁地移动到服务器端,请选择BLUR仅在键盘焦点离开该字段后才能传送输入以移动到另一个字段或其他窗口小部件。

因此,当您访问TextArea实例的当前值时,它可能实际上并非如此。当用户正在键入时,新的文本可能还没有通过网络从浏览器端的HTML / JavaScript到服务器端的Java对象。

顺便说一下,如果使用其他线程中的TextArea,请确保通过UI.accessVaadinSession.access方法正确执行此操作。永远不要直接从后台线程访问用户界面小部件。