java - Vaadin 无法将项目添加到网格

标签 java vaadin vaadin8 vaadin-grid

我有一个网格,我试图从传入的 websocket 数据自动更新它。我正在尝试将新消息添加到网格数据保存器,但我在堆栈跟踪中收到多个错误。

@Push
public class MyUI extends UI implements Broadcaster.BroadcastListener {

VerticalLayout vertmain;
List<Trade> trades;

@Override
protected void init(VaadinRequest request) {

    vertmain = new VerticalLayout();
    vertmain.addComponent(new Label("start"));

    trades = Arrays.asList(Trade.newTrade(1, "buy"), Trade.newTrade(2, "sell"));

    Grid<Trade> grid = new Grid<>();
    grid.setItems(trades);
    grid.addColumn(Trade::getSide);
    grid.addColumn(Trade::getSize);

    vertmain.addComponent(grid);


    //start weboscket stream in new thread
    access(() -> {
        try {
            WebsocketSetup.startStream();
        } catch (Exception e) { e.printStackTrace(); }
    });

    // Register to receive broadcasts
    Broadcaster.register(this);

    setContent(vertmain);
}

@Override
public void receiveBroadcast(final String message) {
    // Must lock the session to execute logic safely
    access(new Runnable() {
        @Override
        public void run() {

            trades.add(Trade.newTrade(100, message));

        }
    });
}

我是 vaadin 的新手,可能会忽略一些东西,但一直在搞乱网格,无法让它工作..

堆栈跟踪

Apr 03, 2018 12:35:57 AM com.vaadin.server.DefaultErrorHandler doDefault
SEVERE: 
java.util.concurrent.ExecutionException: java.lang.UnsupportedOperationException
    at java.base/java.util.concurrent.FutureTask.report(FutureTask.java:122)
    at java.base/java.util.concurrent.FutureTask.get(FutureTask.java:191)
    at com.vaadin.server.VaadinSession$FutureAccess.get(VaadinSession.java:114)
    at com.vaadin.server.VaadinService.runPendingAccessTasks(VaadinService.java:2049)
    at com.vaadin.server.VaadinSession.unlock(VaadinSession.java:1019)
    at com.vaadin.server.VaadinService.ensureAccessQueuePurged(VaadinService.java:2011)
    at com.vaadin.server.VaadinService.accessSession(VaadinService.java:1977)
    at com.vaadin.server.VaadinSession.access(VaadinSession.java:1418)
    at com.vaadin.ui.UI.access(UI.java:1562)
    at my.vaadin.MyUI.receiveBroadcast(MyUI.java:101)
    at my.vaadin.utils.Broadcaster$1.run(Broadcaster.java:35)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.base/java.lang.Thread.run(Thread.java:844)
Caused by: java.lang.UnsupportedOperationException
    at java.base/java.util.AbstractList.add(AbstractList.java:153)
    at my.vaadin.MyUI.addTrade(MyUI.java:120)
    at my.vaadin.MyUI.access$000(MyUI.java:23)
    at my.vaadin.MyUI$2.run(MyUI.java:105)
    at com.vaadin.ui.UI.accessSynchronously(UI.java:1501)
    at com.vaadin.ui.UI$3.run(UI.java:1565)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:514)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at com.vaadin.server.VaadinService.runPendingAccessTasks(VaadinService.java:2046)
    ... 10 more

最佳答案

Arrays.asList返回一个不可变列表,这意味着它不能被修改。这与 Vaadin 无关。

相反,尝试以经典方式创建列表: trades = new LinkedList<>(); trades.add(...);

添加新项目后,您可能应该刷新网格: grid.getDataProvider().refreshAll();

关于java - Vaadin 无法将项目添加到网格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49623805/

相关文章:

html - 具有值和 ID 的 Vaadin ComboBox

java - 如何从 Vaadin 8 URL 中删除 "#!"?

java - Vaadin 8 - 如何绑定(bind) RadioButtonGroup 的项目?

java - 使用 'spring boot + mybatis'创建的项目使用 'spring Application'可以启动,如果使用外部tomcat,注入(inject)dao报错

java - this.getClass().getClassLoader().getResourceAsStream() 在 RCP 产品中不起作用

java - 如何使用 Java ClassLoader 打开外部 H2DB 驱动程序?

java - 通过 Spring Boot 和 Vaadin 传播代码更​​改,无需在 Eclipse 中重新启动应用程序

java - 在 Java 中连接两个字符串的最快方法是什么?

css - 如何将特定 Vaadin View 的背景图像更改为图像?

java - 无法在 Java 中使用 iText 7.1.9 创建 PDF