/**
  * Creates the link between the model and the view by calling {@link Binder#bindContainer(Class,
  * java.awt.Container, UpdateTime)} and passing it the class of the model, the view component, and
  * when to make the updates.
  *
  * <p>This code assumes that the updates will never occur automatically.
  *
  * <p>Also, this code calls the protected method {@link #preModelBind()} to allow subclasses to
  * modify the binding characteristics before copying the model fields to the view.
  *
  * @param model
  */
 public void bind(T model) {
   if (this.model != null) {
     throw new IllegalStateException("Already bound exception");
   }
   this.model = model;
   Binder.bindContainer(model.getClass(), panel, UpdateTime.NEVER);
   preModelBind();
   Binder.modelToView(model, panel);
 }
  static {
    Binder.setDefaultAdapter(JRadioButton.class, RadioButtonAdapter.class);
    Binder.setBindingResolver(
        new BindingResolver() {
          public BindingInfo getBindingInfo(Component view) {
            String name = view.getName();
            if (name == null || !name.startsWith("@")) {
              return null;
            }

            //				System.out.println("Name:" + name);
            name = name.substring(1).trim(); // cut the "@"
            int point = name.indexOf(".");
            if (point >= 0) name = name.substring(0, point).trim();
            return new BindingInfo(name);
          }

          public void storeBindingInfo(Component view, BindingInfo info) {}
        });
  }
 /**
  * This method is invoked by the application code whenever it wants to copy data from the view to
  * the model.
  *
  * @return <code>true</code> if successful, <code>false</code> otherwise
  */
 public boolean commit() {
   if (model != null) {
     try {
       Binder.viewToModel(model, panel);
     } catch (AdapterException e) {
       e.printStackTrace();
       return false;
     }
   }
   return true;
 }