我实例化了Vaadin的正常TextArea
而没有特别的额外内容。现在在一个线程中我更新了一个长字符串,它应该显示在文本区域内。更新全部发生5秒。我做的是以下内容:
public void setLogText(String text)
{
Runnable uiRunnable = () -> {
if (logTextArea != null)
{
System.out.println("logTextArea");
logTextArea.setReadOnly(false);
logTextArea.setValue("");
logTextArea.markAsDirty();
logTextArea.setValue(text);
logTextArea.markAsDirty();
logTextArea.setCursorPosition(text.length());
logTextArea.setReadOnly(true);
}
};
UI.getCurrent().access(uiRunnable);
UI.getCurrent().push();
}
从放入控制器的线程调用此方法。
现在我的问题是,如果我调用方法setValue("")
并在调试模式下运行应用程序,它会将文本设置为""
。但之后我将文本设置为线程创建的新文本。此新文本包含旧文本和新文本。现在发生的是,文本将被放入TextArea
两次,三次,四次(与线程一样频繁)。
我只想在那里有一次文字。
修改
以下是代码段,从中调用方法setLogTex(...)
:
new Thread(new Runnable()
{
@Override
public void run()
{
while (!Thread.interrupted())
{
try
{
Files.lines(Vars.LOGGING_LOG_FILE.toPath()).forEach(new Consumer<String>()
{
@Override
public void accept(String t)
{
resultString += "\n" + t;
}
});
administrationComponent.setLogText(resultString);
Thread.sleep(WAIT_TIME_MSEC);
}
catch (IOException e)
{
Log.warn(AdministrationLogController.class, "Cannot read log file.", e, administrationComponent.getSessionID());
}
catch (InterruptedException e)
{
Log.warn(AdministrationLogController.class, "The read log file thread has been interrupted.", e,
administrationComponent.getSessionID());
}
}
}
}).start();