如何使用 Vaadin 显示大量文本?
How do I show a lot of text using Vaadin?
我需要处理一些数据并在网页上显示处理日志。 (大约 300 行文字)。
我尝试使用标签。起初它工作正常 - 页面变得可滚动并且可以看到所有文本。但是在大约 100 个标签页面变得无响应之后。
如何管理这个任务?
(我试图在 webcomponents.org 上寻找一些其他组件,但找不到任何东西。)
您可以将所有文本仅放在一个组件中,而不是为每一行创建一个单独的组件。如果您希望文本中的换行符(即 \n
)换行到下一行,您可以将元素的 white-space
CSS 属性 调整为例如pre-line
或 pre-wrap
代替。您可以使用 component.getElement().getStyle().set("white-space", "pre-wrap")
.
执行此操作
如果您想直观地指示文本的状态,另一种选择可能是只读 TextArea
组件。
我还建议在 Vaadin 10 中使用 Span
组件而不是 Label
。Label
在浏览器中使用 <label>
元素,这实际上只是为了用于标记输入字段,但不适用于通用文本块。
TextArea
我尝试了 , using TextArea
中提到的一种方法。
当我预加载 300 条短线时,没问题。单击一个按钮一次可以再添加 10 行,一切顺利。使用网络浏览器的 window 滚动条可以流畅地上下滚动。
我将 Vaadin 10.0.4 与 Java 10.0.1 (Zulu by Azul Systems) 一起使用,在连接到 MacBook Pro Retina 的外部 4K 显示器上的 macOS High Sierra 浏览器 Safari 11.1.2 中.
这是整个 Vaadin 应用程序。
package com.basilbourque.example;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.dependency.HtmlImport;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextArea;
import com.vaadin.flow.router.Route;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* The main view contains a button and a template element.
*/
@HtmlImport ( "styles/shared-styles.html" )
@Route ( "" )
public class MainView extends VerticalLayout {
TextArea textArea;
// Constructor.
public MainView () {
this.setWidth( "100%" );
this.textArea = new TextArea( "Logs" );
this.textArea.setWidth( "100%" );
this.textArea.setReadOnly( true );
this.appendRows( 300 );
Button button = new Button( "Add 10 more rows" , event -> {
this.appendRows( 10 );
} );
this.add( button , this.textArea );
this.setClassName( "main-layout" );
}
private void appendRows ( int countRows ) {
List< String > entries = new ArrayList<>( countRows );
for ( int i = 1 ; i <= countRows ; i++ ) {
entries.add( Instant.now().toString() );
}
Collections.reverse( entries ); // Put newest on top.
String s = entries.stream().collect( Collectors.joining( "\n" ) );
textArea.setValue( s + "\n" + this.textArea.getValue() );
}
}
我需要处理一些数据并在网页上显示处理日志。 (大约 300 行文字)。
我尝试使用标签。起初它工作正常 - 页面变得可滚动并且可以看到所有文本。但是在大约 100 个标签页面变得无响应之后。
如何管理这个任务?
(我试图在 webcomponents.org 上寻找一些其他组件,但找不到任何东西。)
您可以将所有文本仅放在一个组件中,而不是为每一行创建一个单独的组件。如果您希望文本中的换行符(即 \n
)换行到下一行,您可以将元素的 white-space
CSS 属性 调整为例如pre-line
或 pre-wrap
代替。您可以使用 component.getElement().getStyle().set("white-space", "pre-wrap")
.
如果您想直观地指示文本的状态,另一种选择可能是只读 TextArea
组件。
我还建议在 Vaadin 10 中使用 Span
组件而不是 Label
。Label
在浏览器中使用 <label>
元素,这实际上只是为了用于标记输入字段,但不适用于通用文本块。
TextArea
我尝试了 TextArea
中提到的一种方法。
当我预加载 300 条短线时,没问题。单击一个按钮一次可以再添加 10 行,一切顺利。使用网络浏览器的 window 滚动条可以流畅地上下滚动。
我将 Vaadin 10.0.4 与 Java 10.0.1 (Zulu by Azul Systems) 一起使用,在连接到 MacBook Pro Retina 的外部 4K 显示器上的 macOS High Sierra 浏览器 Safari 11.1.2 中.
这是整个 Vaadin 应用程序。
package com.basilbourque.example;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.dependency.HtmlImport;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextArea;
import com.vaadin.flow.router.Route;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* The main view contains a button and a template element.
*/
@HtmlImport ( "styles/shared-styles.html" )
@Route ( "" )
public class MainView extends VerticalLayout {
TextArea textArea;
// Constructor.
public MainView () {
this.setWidth( "100%" );
this.textArea = new TextArea( "Logs" );
this.textArea.setWidth( "100%" );
this.textArea.setReadOnly( true );
this.appendRows( 300 );
Button button = new Button( "Add 10 more rows" , event -> {
this.appendRows( 10 );
} );
this.add( button , this.textArea );
this.setClassName( "main-layout" );
}
private void appendRows ( int countRows ) {
List< String > entries = new ArrayList<>( countRows );
for ( int i = 1 ; i <= countRows ; i++ ) {
entries.add( Instant.now().toString() );
}
Collections.reverse( entries ); // Put newest on top.
String s = entries.stream().collect( Collectors.joining( "\n" ) );
textArea.setValue( s + "\n" + this.textArea.getValue() );
}
}