java - 从线程中动态删除和添加 vaadin 中的组件

标签 java multithreading vaadin vaadin7

我有一个 Vaadin 7 应用程序,它具有通用布局,其中有一个按钮,可以启动线程,进行一些计算。

有一个组件从计算中接收信息并显示进度信息等。

现在,当我启动应用程序并执行计算线程时,一切都很好,并且 View 已正确构建。

当它完成并重新运行它时,只需再次按下开始按钮,我就得到了

Exception in thread "Thread-56" java.lang.IllegalStateException: A connector should not be marked as dirty while a response is being written.
at com.vaadin.ui.ConnectorTracker.markDirty(ConnectorTracker.java:505)
at com.vaadin.server.AbstractClientConnector.markAsDirty(AbstractClientConnector.java:141)
at com.vaadin.ui.AbstractComponentContainer.removeComponent(AbstractComponentContainer.java:227)
at com.vaadin.ui.AbstractOrderedLayout.removeComponent(AbstractOrderedLayout.java:178)
at com.test.pipeline.view.ResultPanel.rebuildResultLayout(ResultPanel.java:46)
at com.test.pipeline.view.ResultUIProcessListener.startTests(ResultUIProcessListener.java:40)
at com.test.pipeline.RanorexClient$RanorexWorker$$Lambda$224/988244250.accept(Unknown Source)
at java.util.ArrayList.forEach(ArrayList.java:1249)
at com.test.pipeline.RanorexClient$RanorexWorker.inform(RanorexClient.java:99)
at com.test.pipeline.RanorexClient$RanorexWorker.run(RanorexClient.java:64)

RanorexoClient$RanorexWorker 是一个执行计算的Thread。 有向工作人员注册的监听器以获取通知。

所以我有一个链形成一个线程来更改 UI。

rebuildResultLayout 看起来像这样

void rebuildResultLayout() {
    mainLayout.removeComponent(resultLayout);
    resultLayout = new VerticalLayout();
    mainLayout.addComponent(resultLayout);
}

因此删除布局,创建新布局并再次添加。这是为了删除以前运行中的信息 - 我也尝试简单地 resultLayout.removeAllComponents(),但这会导致相同的错误。

我在某处读到同步对 UI 的调用,所以目前我的 inform 方法如下所示

private void inform(Consumer<TestProcessListener> action) {
    synchronized (UI.getCurrent()) {
        processListeners.forEach(action);
    }
}

出了什么问题?必须做什么才能避免异常?

最佳答案

https://vaadin.com/docs/-/part/framework/advanced/advanced-push.html 中所述需要将 ui 修改包装在 ui.access() 调用中。

另请参阅 @André Schild 评论,必须确保存在有效的 UI 引用

关于java - 从线程中动态删除和添加 vaadin 中的组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39162629/

相关文章:

java - 包P1和P2有依赖循环,但是P1的类没有使用P2(通过jdepend分析)

Python threading.Timer 只重复一次

android - Kotlin 高阶函数传递一个参数数量可变的函数作为参数

javascript - vaadin-combo-box/vaadin-combo-box-overlay 更改背景颜色/polymer API

java - 如何从一组角色中仅获取一个角色

java - WebSphere 服务器未接受 EAR 中的新更改

java - 什么时候调用actionPerformed?

java - 执行顺序和Thread.sleep

vaadin - 更改网格中单元格的颜色(Vaadin)

java - getFailedLoginAttempts() 函数在 Vaadin 的 appfoundation 中没有任何意义