如何在按钮clickListener事件中将变量传递给方法?

时间:2018-08-09 13:00:38

标签: java vaadin7 clicklistener

我有一个带有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++;
    }

此方法按照其说明执行-添加新行。

注意:deductionsGridrowIndex被标记为final;我正在使用Vaadin 7.6.2

1 个答案:

答案 0 :(得分:1)

似乎您总是将$(document).ready(function (){})作为rowIndex传递到函数中。函数内部的增量不会更改函数外部的值(即使会,“外部”也只是具有局部范围的另一个变量)

也许尝试使用GridLayout#getRows动态确定rowIndex。

发表评论后

编辑

如果getRows()函数始终返回预定的网格大小,则可能是GridLayout本身就是问题所在。似乎打算将其用于布置给定的内容。当您动态创建/更改内容时,列表,表格或某些迭代组件可能是此处的正确工具