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

时间:2016-08-26 09:12:27

标签: java multithreading vaadin vaadin7

我有一个Vaadin 7应用程序,它有一个共同的布局,其中有一个按钮,它启动一个线程,进行一些计算。

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

现在,当我启动应用程序并执行计算线程时,一切正常并且视图构建正确。

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

.directive("event", function() {
    return {
      restrict: "E",
      replace: true,
      scope:{
        video: '=videoObject'
      },
      template: '<a class="btn btn-default event-margin" ng-style="{color: video.iconColor, float: floatEvents}" type="button"  data-title="{{event.title}}"><span class="fa fa-fw {{event.icon}}"></span></a>',
      link: function(scope, elm, attrs) {
        elm
        .on('mouseenter', function() {
          elm.css('background-color', scope.video.color);
          elm.css('color','#FFFFFF');
        })
        .on('mouseleave', function() {
          elm.css('background-color','#FFFFFF');
          elm.css('color', scope.video.color);
        });
      }
    };

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。 有工作人员注册的听众可以获得通知。

所以我有一个链形式的线程来改变UI。

Thread看起来像这样

rebuildResultLayout

删除布局,创建新布局并再次添加。这是为了摆脱之前运行的信息 - 我也只是尝试void rebuildResultLayout() { mainLayout.removeComponent(resultLayout); resultLayout = new VerticalLayout(); mainLayout.addComponent(resultLayout); } ,但这会导致同样的错误。

我在某处读取同步调用UI,所以目前我的resultLayout.removeAllComponents()方法看起来像这样

inform

有什么问题?必须采取哪些措施来避免例外?

1 个答案:

答案 0 :(得分:2)

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

另见@AndréSchild评论说必须确保存在有效的UI引用