Java Vaadin 14:如何从另一个线程更新组件的css样式?

Java Vaadin 14:如何从另一个线程更新组件的css样式?,java,css,animation,vaadin,vaadin-flow,Java,Css,Animation,Vaadin,Vaadin Flow,因此,我对Vaadin Flow 14有一个问题,我有一个组件在它的CSS中使用了position:static和position:absolute。它还有一个很酷的动画,我需要使用两个位置,这样它看起来就不会很奇怪,可以占据所有的屏幕,还可以滚动 其行为如下所示: 组件在其CSS文件中以位置开始:static(可滚动) 单击组件并使用getStyle()方法设置position:absolute 关闭组件,它会返回到位置:static,这样它就可以在其父组件中并可滚动 问题在第3步。我通过使用

因此,我对Vaadin Flow 14有一个问题,我有一个组件在它的CSS中使用了
position:static
position:absolute
。它还有一个很酷的动画,我需要使用两个位置,这样它看起来就不会很奇怪,可以占据所有的屏幕,还可以滚动

其行为如下所示:

  • 组件在其CSS文件中以
    位置开始:static
    (可滚动)
  • 单击组件并使用getStyle()方法设置
    position:absolute
  • 关闭组件,它会返回到
    位置:static
    ,这样它就可以在其父组件中并可滚动
  • 问题在第3步。我通过使用getStyle()删除绝对值来设置
    位置:static
    。删除()。我正在从另一个线程中执行此操作,以便在动画完成后删除样式,这样它就不会看起来很奇怪,与打开组件时的流程相同,并且没有跳转剪切

    样式将从组件中删除,但不会立即更新,并且组件无法滚动,因为它的位置仍然是绝对的。但是,如果我单击一个链接转到另一个新选项卡并返回到主选项卡,它现在会更新,并且组件处于静态位置

    我试图通过在我的主类上添加@Push来解决这个问题,但它不起作用,因为我在视图中有视图,而这是一个嵌套视图中的自定义组件,它不在主类中。我必须能够从组件本身更新它,就像我删除样式一样。我只想让组件等待动画播放,然后移除它的位置,这是我能找到的唯一方法,任何其他尝试都不会等待动画播放,而是立即更新自身

    这是我用来删除样式的线程代码

    new Thread(() -> {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                this.getUI().get().access(() -> {
                    getContent().getStyle().remove("position");
                });
            }).start();
    
    解决了

    在实例中获取当前UI并手动设置其推送配置

    UI currentUI = UI.getCurrent();
    currentUI.getPushConfiguration().setPushMode(PushMode.MANUAL);
    
    并在线程中的代码末尾添加以下内容:

    currentUI.push();
    

    工作原理与预期完全相同。

    Vaadin Flow 14@basilbourquen您应该将对UI的引用存储在线程外部(例如,存储在组件本身中)并使用它。例如,在attach事件中保留它,然后在thread中重新使用。您是否验证了
    access
    回调中的代码是否实际运行?它的行为方式与我在thread@anasmi中使用的相同,代码确实运行,它确实删除了组件样式,但它的位置不是静态的,除非我打开指向另一个选项卡的外部链接并返回到我的应用程序选项卡Yes,我在@LeifÅstrand做了。代码确实运行,它确实删除了组件样式,但它的位置不是静态的,除非我打开指向另一个选项卡的外部链接并返回到我的应用程序选项卡。这意味着UI不会立即更新,我必须从UI打开另一个选项卡,以便它更新组件样式