【问题标题】:Pushing Images Vaadin Java推送图像 Vaadin Java
【发布时间】:2022-01-20 09:01:21
【问题描述】:

我正在尝试在 Vaadin-Java 中创建一个回合制纸牌游戏,到目前为止一切顺利,但我在将 Vaadin 图像推送到其他 UI 时遇到了问题。我确实从 Vaadin 文档中复制了 Broadcast/BroadcasterView 类,它按预期工作,但不适用于图像。

public class Broadcaster {
    static Executor executor = Executors.newSingleThreadExecutor();

    static LinkedList<Consumer<String>> listeners = new LinkedList<>();

    public static synchronized Registration register(
            Consumer<String> listener) {
        listeners.add(listener);

        return () -> {
            synchronized (Broadcaster.class) {
                listeners.remove(listener);
            }
        };
    }

    public static synchronized void broadcast(String message) {
        for (Consumer<String> listener : listeners) {
            executor.execute(() -> listener.accept(message));
        }
    }
}
@Push
@Route("broadcaster")
public class BroadcasterView extends Div {
    VerticalLayout messages = new VerticalLayout();
    Registration broadcasterRegistration;

    // Creating the UI shown separately

    @Override
    protected void onAttach(AttachEvent attachEvent) {
        UI ui = attachEvent.getUI();
        broadcasterRegistration = Broadcaster.register(newMessage -> {
            ui.access(() -> messages.add(new Span(newMessage)));
        });
    }

    @Override
    protected void onDetach(DetachEvent detachEvent) {
        broadcasterRegistration.remove();
        broadcasterRegistration = null;
    }
}
public BroadcasterView() {
    TextField message = new TextField();
    Button send = new Button("Send", e -> {
        Broadcaster.broadcast(message.getValue());
        message.setValue("");
    });

    HorizontalLayout sendBar = new HorizontalLayout(message, send);

    add(sendBar, messages);
}

上面的代码对于字符串、Vaadin 图标等都可以正常工作,但是当我替换为并自然地更改广播方法时,没有任何反应。

我已经在整个互联网上搜索了解决方案,但似乎人们不需要推送图像,或者这里根本不可能。我认为这可能是有效载荷的问题,但即使对于 5px x 5px 图像也不起作用

也许你们中的一个人遇到过这样的问题并找到了解决方案?

【问题讨论】:

  • 处理图像的代码在哪里?您如何从 Vaadin 访问它们?

标签: image websocket vaadin push broadcast


【解决方案1】:

您需要通过广播器传递 data,但您所写的尝试让我怀疑您一直在尝试传递 UI 组件(即com.vaadin.flow.component.html.Image)。这是行不通的,因为一个 UI 组件实例不能同时附加到多个位置(即本例中的多个浏览器窗口)。

您可以尝试通过广播器传递数据(例如带有图像 URL 的字符串),然后让每个订阅者根据他们收到的数据创建自己的 Image 组件。

【讨论】:

  • 这不是也适用于 Vaadin 图标吗?这些效果很好,而我什至无法使用 ui.acces(()->) 创建新图像
  • 这取决于您如何使用图标。如果您传递一个图标常量,例如VaadinIcon.VAADIN_H,那么您只是传递了一段数据,该数据标识要使用哪个图标,哪个应该起作用。如果您通过例如的结果VaadinIcon.VAADIN_H.create(),那么你传递的是一个实际的组件实例,它不应该工作。
  • 当你说你不能创建一个新的图像时,那究竟是什么症状呢?是否有任何错误信息?会不会是您创建的图像没有有效的 URL,所以浏览器中没有显示任何内容?
  • 实际上我设法推送了图像!我没有将 从 string 更改为 Image 并将 new Image 放入 Broadcaster.broadcast() 方法中,而是将 Strings 保留,但我添加了 ui.access(() -> board1.add(new Span())); ui.access(() -> board1.add(dragImage)); // 括号以及当我广播新图标时也可以工作,但这对我来说并不重要。
猜你喜欢
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 2019-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多