4.3.3. Returning Values from an Invoked Screen

The methods used for opening screens (openWindow(), openLookup(), openEditor()) also allow you to get values back from these screens.

Returning a value from lookup screen

The openLookup() method accepts a handler for the items selected in the opened lookup screen. In our example, the handler implemented by the lambda expression sets the selected customer for the edited Order instance.

openLookup("sample$Customer.browse",
        items -> {
            if (!items.isEmpty()) {
                getItem().setCustomer((Customer) items.iterator().next());
            }
        },
        WindowManager.OpenType.DIALOG.setWidth("600px").setHeight("400px"));
Returning a value from an arbitrary screen

The idea is that you return a reference to the controller of the opened screen, and then add a CloseListener to this reference. In the listener, you handle the values after the screen is closed.

OrderEdit screen controller demonstrates two ways of looking up a Customer: from a lookup screen and from an arbitrary screen, both returning a Customer instance.

The openWindow() method in the following example will open the customers list screen as a dialog window. CloseWithCommitListener will be notified when the screen is closed by action with Window.COMMIT_ACTION_ID. This listener will be used to set the selected customer for the edited Order instance.

CustomerList window = (CustomerList) openWindow("customer-list", WindowManager.OpenType.DIALOG);
window.addCloseWithCommitListener(() -> {
    getItem().setCustomer(window.getSelectedCustomer());
});