我有一个带有ClickListener事件和一个方法的按钮。该方法负责在单击按钮后在Vaadin GirdLayout中添加新行。
private GridLayout buildDeductionsGrid(){
GridLayout deductionsGrid = new GridLayout(13, 8);
deductionsGrid.setSpacing(true);
deductionsGrid.setWidth("50%");
addDeductionsGridLabelsAndFields(deductionsGrid);
return deductionsGrid;
}
此方法为要插入的行创建一个网格。
private void addDeductionsGridLabelsAndFields(GridLayout deductionsGrid) {
int rowIndex = 1;
btnAddDeductionRow.addClickListener((Button.ClickListener) event -> addNewDeductionRow(deductionsGrid, rowIndex));
}
顾名思义, rowIndex
是需要用addNewDeductionRow
方法增加的行的索引。第一次单击时,它会递增而不会出现问题,但不会保存,因此第二次单击按钮时,它会尝试在按钮时在同一位置添加一行首先被点击。
private void addNewDeductionRow(GridLayout deductionsGrid, int rowIndex) {
String cbValue = deductionTypeDropdown.getValue().toString().toLowerCase();
for (DeductionsGridRow deductionsGridRow : deductionsGridRows) {
if (deductionsGridRow.getDeductionType().getName().toLowerCase().equals(cbValue)) {
deductionsGrid.addComponent(deductionsGridRow.getGridRowLabel(), 0, rowIndex);
deductionsGrid.addComponent(new Label("Amount"), 1, rowIndex);
deductionsGrid.addComponent(deductionsGridRow.getAmount(), 2, rowIndex);
}
}
rowIndex++;
}
此方法按照其说明执行-添加新行。
注意:deductionsGrid
和rowIndex
被标记为final;我正在使用Vaadin 7.6.2
答案 0 :(得分:1)
似乎您总是将$(document).ready(function (){})
作为rowIndex传递到函数中。函数内部的增量不会更改函数外部的值(即使会,“外部”也只是具有局部范围的另一个变量)
也许尝试使用GridLayout#getRows动态确定rowIndex。
发表评论后编辑
如果getRows()函数始终返回预定的网格大小,则可能是GridLayout本身就是问题所在。似乎打算将其用于布置给定的内容。当您动态创建/更改内容时,列表,表格或某些迭代组件可能是此处的正确工具