The application model layer consists of the EntityModel class and its associates; the EntityTableModel, which provides a table representation of entities and the EntityEditModel which provides the CRUD operations.

An EntityModel always contains an EntityEditModel instance and usually contains a EntityTableModel as well. A default edit model implementation is created automatically by the EntityTableModel if one is not supplied via a constructor argument.

entity model diagram
public class AddressModel extends SwingEntityModel {

  public AddressModel(EntityConnectionProvider connectionProvider) {
    super(Address.TYPE, connectionProvider);
  }
}
public class CustomerAddressModel extends SwingEntityModel {

  public CustomerAddressModel(EntityConnectionProvider connectionProvider) {
    super(new CustomerAddressTableModel(connectionProvider));
  }
}

1. Detail models

An EntityModel can contain one or more detail models, usually based on foreign key relationships.

entity detail model diagram
public class StoreApplicationModel extends SwingEntityApplicationModel {

  public StoreApplicationModel(EntityConnectionProvider connectionProvider) {
    super(connectionProvider, List.of(createCustomerModel(connectionProvider)));
  }

  private static SwingEntityModel createCustomerModel(EntityConnectionProvider connectionProvider) {
    CustomerModel customerModel =
            new CustomerModel(connectionProvider);
    CustomerAddressModel customerAddressModel =
            new CustomerAddressModel(connectionProvider);

    customerModel.detailModels().add(customerAddressModel);

    //populate the model with rows from the database
    customerModel.tableModel().items().refresh();

    return customerModel;
  }
}

2. Event binding

The model layer classes expose a number of Event, State and Value observers.

private void bindEvents() {
  CustomerTableModel tableModel = (CustomerTableModel) tableModel();

  tableModel.selection().items()
          .addConsumer(selected ->
                  System.out.println("Items selected: " + selected));

  tableModel.items().refresher().result()
          .addListener(() -> System.out.println("Refresh successful"));

  CustomerEditModel editModel = (CustomerEditModel) editModel();

  editModel.afterInsert()
          .addConsumer(inserted ->
                          System.out.println("Entities inserted" + inserted));

  editModel.editor().value(Customer.FIRST_NAME).edited()
          .addConsumer(firstName ->
                  System.out.println("First name changed to " + firstName));
}

3. Examples