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?
答案 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;
}
}
你的问题写得不清楚,缺乏足够的细节和信息。但看起来您看到TextArea
的价值变化出现延迟。
我怀疑您可能正在从其他线程访问TextArea
的值。
如果是这样,您必须记住,(a)用户在Web浏览器客户端中键入文本作为数据条目,以及(b)到达服务器端的键入文本之间可能存在延迟存储在实际小部件的状态中。
你的Vaadin应用程序确实存在于Java服务器上,它使用HTML,CSS,JavaScript等由Web浏览器中的Vaadin框架客户端自动远程呈现UI。客户端框架接受用户的输入和将其自动传递回服务器端以存储在Java对象(TextArea
实例)中。
但是,用户输入时服务器端对象的更新频率是多少?涉及多少延迟?这取决于您使用方法ValueChangeMode
和TextArea::setValueChangeMode
指定的TextArea::getValueChangeMode
。常量BLUR
,EAGER
,LAZY
和TIMEOUT
各自规定了不同的时间。默认值为LAZY
,记录为:
在每个用户事件上,在定义的时间间隔后安排服务器端事件,取消当前安排的事件(如果有)。例如,如果你想在发送事件之前等待用户输入的一小段时间,这是一个不错的选择。
要加快向服务器端传送用户输入,请将模式更改为EAGER
,以便在每次按键时更新。但这会增加网络流量,使你的应用程序更加“健谈”。不好的互联网连接不好,但在本地网络上也许不错。
要将用户输入更频繁地移动到服务器端,请选择BLUR
仅在键盘焦点离开该字段后才能传送输入以移动到另一个字段或其他窗口小部件。
因此,当您访问TextArea
实例的当前值时,它可能实际上并非如此。当用户正在键入时,新的文本可能还没有通过网络从浏览器端的HTML / JavaScript到服务器端的Java对象。
顺便说一下,如果使用其他线程中的TextArea
,请确保通过UI.access
和VaadinSession.access
方法正确执行此操作。永远不要直接从后台线程访问用户界面小部件。