我的问题的主要问题是,我想从键盘将数据插入我的网格。一些数据是从数据库加载的,用户可以更改(也可以更改加载的数据)或将新数据插入网格(手动)。然后我想看到最后一行列的结果(检查我图片中的结果)-结果是指第一列中数据的行数-总和、平均值、最小值、最大值…
因此,当我单击第三行时,进入列例如人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 + "");
});
我如何修复它?
这就是问题所在,我不想让这个页脚在网格上始终可见。我想只有在我到达网格末尾时才能看到页脚。你明白吗?
假设到目前为止,您已经弄清楚了为什么要通过使用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);
}
}
这已经在使用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等)