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

使用Vaadin 7.4.9 - 如何从网格中删除数据

燕野
2023-03-14

我需要从网格(容器)中删除数据,然后我需要刷新行。我该怎么做?

Grid grid = new Grid();
IndexedContainer container = new IndexedContainer();
grid.setContainerDataSource(container);
container.addContainerProperty("firstNumber", Integer.class, 0);
container.addContainerProperty("secondNumber", Integer.class, 0);

container.addItem(1);

Item item = container.getItem(1);
int firstNumber = item.getItemProperty("firstNumber").setValue("1");

item = container.getItem(1);
int secondNumber = item.getItemProperty("secondNumber").setValue("2");

现在我尝试只更改单元格而不删除项目。我的代码是

container.addValueChangeListener(e -> {

         Item item = container.getItem(35);
         item.getItemProperty("Person5").setValue("SS");

         grid.recalculateColumnWidths();
         grid.clearSortOrder();
         grid.refreshAllRows();

     });

但是我也有错误…:(

Morfic的信息:

我需要更改网格单元格中显示的数据。例如,我有3行,属性ID为firstNumber和secondNumber,第4行表示行的总和。所以,我从数据库中得到了一些数据。我需要包括一些数据手动“从键盘”到网格。。。

想象一下这种情况:

firstNumber在网格1中有数据,空,2-第四个单元格中的和是3。我想在单元格中添加或更改数据。现在,我在第二个位置加上数字5。在网格中,我现在有数字:1,5和2。我希望在第四个单元格中立即有和8。这是我的大问题。

我尝试将ValueChangeListener添加到网格。

     container.addValueChangeListener(e -> {

     int sum = 0;

     for(int i = 1; i <= 3; i++)
     {
       Item item = container.getItem(i);
       sum += (Integer) item.getItemProperty("firstNumber").getValue();
     }

       item = container.getItem(4);
       item.getItemProperty("firstNumber").setValue(sum);

       grid.recalculateColumnWidths();
       grid.clearSortOrder();
       grid.refreshAllRows();

 });

所以我得到了错误:

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个答案

方韬
2023-03-14

当涉及网格时,使用Vaadin 7.4.9非常乏味。

删除项必须使用容器完成项(项)

此外,在Vaadin 7.7中刷新网格很容易(刷新所有刷新行()方法添加),在Vaadin 8中尤其容易(使用事件和数据提供程序)。

在Vaadin 7中,您必须通过调用clearSortorder自动重绘网格来破解它。

当您从另一个线程(即不在ValueChangeListener中)更新UI时,将使用以下代码,但是您需要启用Vaadin-Push Addon,它是一个独立的依赖项。

getUI.access(() -> {
        List<SortOrder> sortOrders = new ArrayList<>();
        grid.getSortOrder().forEach(sortOrder -> sortOrders.add(sortOrder));
        grid.recalculateColumnWidths();
        grid.clearSortOrder();
        grid.setSortOrder(sortOrders);

        getUI().push();
    });

编辑:如果您使用组合框的buttonClick或ValueChangeEvent进行删除,您可以简单地执行以下操作:

component.addValueChangeListener(e -> {

         Item item = container.getItem(35);
         container.removeItem(item);    

         container.addItem(35);

         item.getItemProperty("Person5").setValue("SS");

         grid.recalculateColumnWidths();
         grid.clearSortOrder();
         grid.refreshAllRows();

     });

但是请注意,您的实现在容器上有一个ValueChangeListener,它调用container.removeItem(35),这将导致另一个触发器另一个ValueChanged-Event,它将再次尝试删除项目号35。您必须为ValueChangeListener使用另一个组件,否则您将陷入无休止的循环

葛景龙
2023-03-14

您的< code >起因于:Java . lang . stack overflow error 问题是因为您在生成其他事件的< code>ValueChangeListener中更改值,并且您最终陷入了一个无限循环,正如@Manuel Kollegger试图指出的那样,因此需要一种不同的方法。

想到的最简单的想法是生成一个列,您可以根据其他2个列来计算该列的值。但是,根据文档,Vaadin 7中没有直接的方法来定义生成的列,因此您必须使用生成的属性容器包装容器:

网格没有生成的列。相反,容器数据源可以围绕GeneratedPropertyContainer包装。

此外,您可能希望将生成属性设置为只读,以防止用户手动编辑它。

根据您的描述,下面的示例显示了如何完成此操作。请注意,为了简洁起见,它并非完全万无一失(空值,无效值等),但它应该让您入门:

import com.vaadin.data.Item;
import com.vaadin.data.util.GeneratedPropertyContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.data.util.PropertyValueGenerator;
import com.vaadin.ui.Grid;
import com.vaadin.ui.VerticalLayout;

import java.util.Random;

public class GridWithCalculatedColumn extends VerticalLayout {

    public GridWithCalculatedColumn() {
        // indexed container allowing the definition of custom properties
        IndexedContainer container = new IndexedContainer();
        container.addContainerProperty("firstNumber", Integer.class, 0);
        container.addContainerProperty("secondNumber", Integer.class, 0);

        // generated property container allowing the definition of generated properties
        GeneratedPropertyContainer wrappingContainer = new GeneratedPropertyContainer(container);
        wrappingContainer.addGeneratedProperty("sum", new PropertyValueGenerator<Integer>() {
            @Override
            public Integer getValue(Item item, Object itemId, Object propertyId) {
                // sum the other 2 columns
                // NOTE: for the sake of simplicity this does not handle invalid values such as "null"
                return (Integer) item.getItemProperty("firstNumber").getValue() + (Integer) item.getItemProperty("secondNumber").getValue();
            }

            @Override
            public Class<Integer> getType() {
                return Integer.class;
            }
        });

        // add some dummy data
        Random random = new Random();
        for (int i = 0; i < 5; i++) {
            Item item = wrappingContainer.addItem(i);
            item.getItemProperty("firstNumber").setValue(random.nextInt(10));
            item.getItemProperty("secondNumber").setValue(random.nextInt(10));
        }


        // basic grid setup
        Grid grid = new Grid();
        grid.setContainerDataSource(wrappingContainer);
        grid.setEditorEnabled(true);
        // disable editing of the "calculated value"
        grid.getColumn("sum").setEditable(false);
        addComponent(grid);
    }
}

结果:

 类似资料:
  • 我正在编写一个Android应用程序,从图片中提取数独谜题。对于9x9数独网格中的每个单元格,我需要确定它是包含数字1到9中的一个还是空白。以下是我的算法的大致要点: 自适应阈值拼图 扩展以减少要考虑的轮廓数 找到拼图的轮廓并将其扭曲成正方形 将正方形分成81个相等的单元格;寻找至少有20%白色像素的单元格 找到最靠近这些单元格中心的白色斑点并得到其边界矩形 对边界矩形内的图像部分使用字符识别(k

  • 问题内容: 如何删除字符串中的空格?例如: 输入: 输出: 问题答案: 这个? 例 更新: 基于此问题此: 是更好的解决方案。它产生相同的结果,但执行速度更快。 正则表达式 是“空白”的正则表达式,并且是“全局”标志,表示匹配ALL (空白)。 在这里可以找到一个很好的解释。 附带说明,您可以将单引号之间的内容替换为所需的任何内容,因此可以将空白替换为任何其他字符串。

  • 问题内容: 我正在使用scrapy抓取一个似乎在每个URL末尾向查询字符串添加随机值的网站。这将爬网变成一种无限循环。 我如何抓紧忽略URL的查询字符串部分? 问题答案: 示例代码: 输出示例:

  • 问题内容: 我正在使用php,mysql和ajax从表中删除记录。问题是,在MySQL_query中,它没有获取显示为“ id = undefined”的ID,我试图将ID传递给查询,但我不知道我哪里出了错,我试图打印MySQL的节目 谁能告诉我如何通过身份证…谢谢 我的阿贾克斯 我的HTML delete.php 问题答案: 您ID的索引是1,即第二个索引。不是2。

  • 如何删除Jtable标题网格线,我可以从行中删除网格线,但它在Jtable标题中给出了网格线。是否可以删除Jtable标题网格线。

  • 我想从以下页面中删除“符号”、“名称”和“收益通话时间”下的所有公司信息:https://finance.yahoo.com/calendar/earnings 到目前为止,我只知道公司名称,但我得到了一个错误: NoSuchElementException:没有这样的元素:无法定位元素:{“方法”:“xpath”,“选择器”:“/*[@id='cal-res-table']]/div[1]/ta