我需要从网格(容器)中删除数据,然后我需要刷新行。我该怎么做?
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)
我的问题是,我可以得到最后一行的行的总和。不在新列:)谢谢:)
当涉及网格时,使用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使用另一个组件,否则您将陷入无休止的循环
您的< 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