当前位置: 首页 > 知识库问答 >
问题:

使用Vaadin 7实时将数学运算结果设置到Vaadin网格中(手动插入)

丁正阳
2023-03-14

我的问题的主要问题是,我想从键盘将数据插入我的网格。一些数据是从数据库加载的,用户可以更改(也可以更改加载的数据)或将新数据插入网格(手动)。然后我想看到最后一行列的结果(检查我图片中的结果)-结果是指第一列中数据的行数-总和、平均值、最小值、最大值…

因此,当我单击第三行时,进入列例如人3,并且当我将值从5更改为6时,此时总和将为16,最大值将为6,最小值为1,平均值将为3.2

我的网格代码是:

Grid grid = new Grid();

IndexedContainer container = new IndexedContainer();
grid.setContainerDataSource(container);

container.addContainerProperty("September", String.class, null);
container.addContainerProperty("Person1", String.class, null);
container.addContainerProperty("Person2", String.class, null);
container.addContainerProperty("Person3", String.class, null);
container.addContainerProperty("Person4", String.class, null);
container.addContainerProperty("Person5", String.class, null);
container.addContainerProperty("Person6", String.class, null);
container.addContainerProperty("Person7", String.class, null);
container.addContainerProperty("Person8", String.class, null);

for(int i = 0; i < 10; i++)
     container.addItem(i);

Item item = container.getItem(1);

item.getItemProperty("September").setValue("1.9.2017 Piatok");

item = container.getItem(2);
item.getItemProperty("September").setValue("2.9.2017 Sobota");

....

我试图将添加值更改通知程序添加到网格(容器

container.addValueChangeListener(e -> {

       int sum = 0;
       for(int i = 0; i < 5; i++)
       {
         Item item = container.getItem(i);
         sum += (Integer) item.getItemProperty("Person3").getValue();
       }

         item = container.getItem(6);
         item.getItemProperty("Person3").setValue(sum);

     });

但是我得到了错误消息:

sep 15, 2017 4:16:21 PM com.vaadin.server.DefaultErrorHandler doDefault
SEVERE: 
com.vaadin.data.Buffered$SourceException
    at com.vaadin.ui.AbstractField.setValue(AbstractField.java:546)
    at com.vaadin.ui.AbstractField.setValue(AbstractField.java:468)
    at com.vaadin.ui.AbstractTextField.changeVariables(AbstractTextField.java:205)
    at com.vaadin.server.communication.ServerRpcHandler.changeVariables(ServerRpcHandler.java:616)
    at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:463)
    at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:406)
    at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:273)
    at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
    at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
    at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1422)
    at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:380)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:845)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1689)
    at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:225)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1676)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1174)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1106)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:119)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
    at org.eclipse.jetty.server.Server.handle(Server.java:524)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:319)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:253)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)
    at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
    at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.StackOverflowError
    at java.util.Hashtable.get(Hashtable.java:366)
    at com.vaadin.data.util.IndexedContainer$IndexedContainerProperty.setValue(IndexedContainer.java:848)
    at my.vaadin.app.MyUI.lambda$11(MyUI.java:3931)
    at com.vaadin.data.util.IndexedContainer.firePropertyValueChange(IndexedContainer.java:528)
    at com.vaadin.data.util.IndexedContainer.access$1000(IndexedContainer.java:63)
    at com.vaadin.data.util.IndexedContainer$IndexedContainerProperty.setValue(IndexedContainer.java:867)
    at my.vaadin.app.MyUI.lambda$11(MyUI.java:3931)

问题是当我试图改变2个或更多的细胞…

 container.addValueChangeListener(e -> {


                Item item = container.getItem(6);

                 if(!e.getProperty().equals(item.getItemProperty("Person3")))
                        item.getItemProperty("Person3").setValue(54 + "");

                 if(!e.getProperty().equals(item.getItemProperty("Person4")))
                    item.getItemProperty("Person4").setValue(65 + "");

          });

我如何修复它?

这就是问题所在,我不想让这个页脚在网格上始终可见。我想只有在我到达网格末尾时才能看到页脚。你明白吗?

共有2个答案

潘英豪
2023-03-14

假设到目前为止,您已经弄清楚了为什么要通过使用ValueChangeListener来更新总和行来获得SOE,您可以使用类似的方法来克服这个问题,方法是使用编辑器CONHandler,因此当保存编辑器更改时,总和行会被更新。为简洁起见,下面的示例仅计算总和,但您可以对其余操作应用类似的逻辑:

public class GridWithCalculatedRow extends VerticalLayout {

    public GridWithCalculatedRow() {
        // indexed container allowing the definition of custom properties
        IndexedContainer container = new IndexedContainer();
        container.addContainerProperty("September", String.class, null);
        container.addContainerProperty("Person1", Integer.class, 0);
        container.addContainerProperty("Person2", Integer.class, 0);
        container.addContainerProperty("Person3", Integer.class, 0);


        // add some dummy data
        Random random = new Random();
        for (int i = 0; i < 5; i++) {
            Item item = container.addItem(i);
            item.getItemProperty("September").setValue(String.valueOf(i));
            item.getItemProperty("Person1").setValue(random.nextInt(10));
            item.getItemProperty("Person2").setValue(random.nextInt(10));
            item.getItemProperty("Person3").setValue(random.nextInt(10));
        }

        Item sumItem = container.addItem(6);
        sumItem.getItemProperty("September").setValue("Sum");

        // basic grid setup
        Grid grid = new Grid();
        grid.setContainerDataSource(container);
        grid.getColumn("September").setEditable(false);
        addComponent(grid);

        // initial sum
        updateSum(container, sumItem);

        // disable editing of sum item
        grid.addItemClickListener(event -> {
            if (event.getItemId().equals(6)) {
                grid.setEditorEnabled(false);
            } else {
                grid.setEditorEnabled(true);
            }
        });


        // editor commit handler to update the sum
        grid.getEditorFieldGroup().addCommitHandler(new FieldGroup.CommitHandler() {
            @Override
            public void preCommit(FieldGroup.CommitEvent commitEvent) throws FieldGroup.CommitException {
                // nothing to do here for now
            }

            @Override
            public void postCommit(FieldGroup.CommitEvent commitEvent) throws FieldGroup.CommitException {
                updateSum(container, sumItem);
            }
        });

    }

    // recalculate all sums and update the sum item
    private void updateSum(IndexedContainer container, Item sumItem) {
        Integer person1Sum = 0;
        Integer person2Sum = 0;
        Integer person3Sum = 0;

        // calculate sums
        for (int i = 0; i < 5; i++) {
            Item item = container.getItem(i);
            person1Sum += (Integer) item.getItemProperty("Person1").getValue();
            person2Sum += (Integer) item.getItemProperty("Person2").getValue();
            person3Sum += (Integer) item.getItemProperty("Person3").getValue();

        }

        // update grid item
        sumItem.getItemProperty("Person1").setValue(person1Sum);
        sumItem.getItemProperty("Person2").setValue(person2Sum);
        sumItem.getItemProperty("Person3").setValue(person3Sum);
    }
}
百里沛
2023-03-14

这已经在使用Vaadin 7.4.9 -如何从网格中删除数据中得到解答。原因是相同的,您在< code > container . addvaluechangelistener 中调用< code>container.setValue,导致无限循环。

您不能在侦听器中调用item.getItemProperty("个性化3"). setValue(sum);

您必须检查您当前设置的项目是否在您上次访问循环时尚未设置。想象以下情况:

int otherValue = 10;

public setValue(int newValue) {
  int sum = newValue + otherValue; //this is your sum
  setValue(sum);    //of course this causes a StackOverFlowError
}

以下是一个适用于您的项目的解决方案

if(!e.getProperty().equals(item.getItemProperty("Person3"))
    item.getItemProperty("Person3").setValue(sum);
 类似资料:
  • 这是我的代码,我需要你的帮助。我需要添加监听器到我的网格,这可以实时添加结果到网格(没有后,例如,点击按钮)。我想把数字加到“第一个数字”一栏,把第二个数字加到“第二个数字”一栏,然后在“结果”一栏中得出数字的和。 第一个数字:“1”,“第二个数字”:“1”,结果将是“2”。

  • 我创建了一个有三列的vaadin网格,其中一列包含HTML内容。HTML数据可以在多行中。默认情况下,网格中只显示第一行HTML数据。 我在用vaadin 7

  • 我是瓦丁开发公司的新人,我希望有人能帮助我。我刚刚用模型创建了一个网格表,一切都很好。但是现在,我想改变选定行的背景颜色。我想,我必须创造一个主题。我在瓦丁论坛上发现了这个:https://vaadin.com/forum/thread/17867059/how-to-set-selected-row-opacity-in-vaadin-grid 这是我已经做过的: 我用链接中的代码创建了一个ht

  • 我正在使用vaadin制作一个CRUD应用程序我有一个带有对象人员(id,姓名,年龄)的网格,我在每行旁边制作了一个“编辑”按钮,但是当我按下按钮时,我如何获得该行的Perg值?

  • 我用的是vaadin 14 TLS。我需要在网格中显示数据。在桌面版本上一切都很好,但是,在移动设备上,列头太窄了,它们不容易读,因为只显示一些首字母,而且有很多列。网格本身适合页面宽度,所以我可以向右和向左滚动,但是,我希望每一列占用更多的空间,以便每一列标题都是可读的,而不会缩短。任何提示都将不胜感激。

  • 在Vaadin 14+中,我正在创建网格,并希望用户有一个稳定/简单的方法将网格的内容导出到csv或Excel。要做到这一点,我感到惊讶的是,Vaadin似乎没有提供此功能,因此必须使用第三方开发插件(如https://Vaadin.com/directory/component/exporter/overview)。然而,这些插件有许多bug(例如不能将带有日期值的网格正确地导出到Excel等)