Добрый день.
Я создал тестовый класс.
Его реализация аналогичная вашей за исключением того, что в нем переопределен один метод initEditComponents (делает поля редактируемыми сразу), и есть 2 листнера:
ExpenseLineBrowseTest
package com.company.itam.web.screens.expenseline;
import com.haulmont.cuba.gui.ComponentsHelper;
import com.haulmont.cuba.gui.components.ComponentContainer;
import com.haulmont.cuba.gui.components.Form;
import com.haulmont.cuba.gui.components.TabSheet;
import com.haulmont.cuba.gui.components.Table;
import com.haulmont.cuba.gui.model.InstanceContainer;
import com.haulmont.cuba.gui.screen.*;
import com.company.itam.entity.ExpenseLine;
@UiController("itam_ExpenseLine.browseTest")
@UiDescriptor("expense-line-browse-test.xml")
@LookupComponent("table")
@LoadDataBeforeShow
public class ExpenseLineBrowseTest extends MasterDetailScreen<ExpenseLine> {
@Override
protected void initEditComponents(boolean enabled) {
TabSheet tabSheet = getTabSheet();
if (tabSheet != null) {
ComponentsHelper.walkComponents(tabSheet, (component, name) -> {
if (component instanceof Form) {
((Form) component).setEditable(enabled);
} else if (component instanceof Table) {
((Table) component).getActions().forEach(action -> action.setEnabled(enabled));
} else if (!(component instanceof ComponentContainer)) {
component.setEnabled(enabled);
}
});
}
getForm().setEditable(true);
getLookupBox().setEnabled(true);
editing = true;
}
@Subscribe(id = "expenseLineDc", target = Target.DATA_CONTAINER)
public void onExpenseLineDcItemPropertyChange(InstanceContainer.ItemPropertyChangeEvent<ExpenseLine> event) {
System.out.println();
}
@Subscribe(id = "expenseLineDc", target = Target.DATA_CONTAINER)
public void onExpenseLineDcItemChange(InstanceContainer.ItemChangeEvent<ExpenseLine> event) {
}
}
И его дескриптор:
<window xmlns="http://schemas.haulmont.com/cuba/screen/window.xsd"
xmlns:c="http://schemas.haulmont.com/cuba/screen/jpql_condition.xsd"
caption="msg://browseCaption"
focusComponent="table"
messagesPack="com.company.itam.web.screens.expenseline">
<data>
<collection id="expenseLinesDc"
class="com.company.itam.entity.ExpenseLine"
view="expenseLine-browse">
<loader id="expenseLinesDl">
<query>
<![CDATA[select e from itam_ExpenseLine e]]>
</query>
</loader>
</collection>
<instance id="expenseLineDc"
class="com.company.itam.entity.ExpenseLine"
view="expenseLine-edit">
<loader/>
</instance>
</data>
<actions>
<action id="save" icon="icons/ok.png" caption="mainMsg://actions.Ok" shortcut="CTRL-ENTER"/>
<action id="cancel" icon="icons/cancel.png" caption="mainMsg://actions.Cancel" description="Esc"/>
</actions>
<dialogMode height="600" width="800"/>
<layout>
<split id="split" height="100%" orientation="vertical" reversePosition="true" width="100%">
<vbox id="lookupBox" expand="table" height="100%" margin="false,true,false,false" spacing="true">
<filter id="filter" applyTo="table" dataLoader="expenseLinesDl">
<properties include=".*"/>
</filter>
<groupTable id="table"
width="100%"
dataContainer="expenseLinesDc">
<actions>
<action id="create" type="create"/>
<action id="edit" type="edit"/>
<action id="remove" type="remove"/>
</actions>
<columns>
<column id="code"/>
<column id="moneyValue"/>
<column id="expenseDate"/>
<!-- <column id="lnkCostCenter"/>-->
<!-- <column id="lnkPortfolio"/>-->
<!-- <column id="expenseType"/>-->
<column id="name"/>
</columns>
<rowsCount/>
<buttonsPanel id="buttonsPanel"
alwaysVisible="true">
<button id="createBtn" action="table.create"/>
<button id="editBtn" action="table.edit"/>
<button id="removeBtn" action="table.remove"/>
</buttonsPanel>
</groupTable>
<hbox id="lookupActions" spacing="true" visible="false">
<button action="lookupSelectAction"/>
<button action="lookupCancelAction"/>
</hbox>
</vbox>
<vbox id="editBox" height="100%" margin="false,false,false,true" expand="fieldGroupBox" spacing="true">
<scrollBox id="fieldGroupBox">
<form id="form" dataContainer="expenseLineDc">
<column width="250px">
<textField id="codeField" property="code"/>
<textField id="moneyValueField" property="moneyValue"/>
<dateField id="expenseDateField" property="expenseDate"/>
<!-- <pickerField id="lnkCostCenterField" property="lnkCostCenter">-->
<!-- <actions>-->
<!-- <action id="lookup" type="picker_lookup"/>-->
<!-- <action id="clear" type="picker_clear"/>-->
<!-- </actions>-->
<!-- </pickerField>-->
<!-- <pickerField id="lnkPortfolioField" property="lnkPortfolio">-->
<!-- <actions>-->
<!-- <action id="lookup" type="picker_lookup"/>-->
<!-- <action id="clear" type="picker_clear"/>-->
<!-- </actions>-->
<!-- </pickerField>-->
<!-- <lookupField id="expenseTypeField" property="expenseType"/>-->
<textField id="nameField" property="name"/>
</column>
</form>
</scrollBox>
<hbox id="actionsPane" spacing="true" visible="false">
<button id="saveBtn" action="save"/>
<button id="cancelBtn" action="cancel"/>
</hbox>
</vbox>
</split>
</layout>
</window>
Чем больше полей, тем быстрее вызывается баг.
Но можно вызвать и с текущим набором.