Project

General

Profile

Construire une nouvelle vue

Cet article concerne la création de vues modales (fenêtres JDialog).

Vous pouvez bien sûr créér vos propres fenêtres entièrement à la main, néanmoins, il est plus facile d'utiliser les classes fournies par JTheque qui vont vous permettre de créer facilement des fenêtres.

Dans JTheque, les vues implémentent l'interface IView qui permet de définir les méthodes de base closeDown(), display(), .... Vous n'êtes pas obligés d'utiliser ces interfaces, néanmoins, cela vous permet d'utiliser des actions génériques ainsi que les controller pour faciliter la gestion des vues. Néanmoins, il ne sera jamais utilise de redéfinir directement ces méthodes.

La façon la plus de créer un nouvelle vue modale est de créer une classe étendant la classe abstraite SwingBuildedDialogView. Cette classe représente une fenêtre dont le contenu est construit à l'aide d'un panel builder. Un builder est en fait un objet qui permet d'ajouter des éléments à un panel (ici le content pane) de manière facilitée.

Voici les constructeurs qui sont disponibles dans cette classe abstraite :

  • SwingBuildedDialogView() : Construit une fenêtre qui est modale par rapport à la vue principale de l'application. Cette vue n'est pas Filthy.
  • SwingBuildedDialogView(boolean filthy) : Construit une fenêtre qui est modale par rapport à la vue principale de l'application. Le paramètre booléean permet de définir si cette vue doit être Filthy ou non.
  • SwingBuildedDialogView(Frame frame) : Construit une fenêtre qui est modale par rapport à la vue passée en paramètre. Cette vue n'est pas Filthy
  • SwingBuildedDialogView(Frame frame, boolean filthy) : Construit une fenêtre qui est modale par rapport à la vue passée en paramètre. Le paramètre booléean permet de définir si cette vue doit être Filthy ou non.

Il faut impérativement appeler la méthode build() depuis le constructeur.

Ensuite de quoi, il faut obligatoirement implémenter 3 méthodes :

  • void initView() : Doit initialiser la vue. C'est à dire modifier le modèle de la vue, le titre, la taille et indiquer si elle redimensionable.
  • void buildView(PanelBuilder builder) : Doit construire la vue en utilisant le builder passé en paramètre. Ce panel utilise un GridBagLayout. Cette méthode sera exécutée dans l'EDT.
  • void validate(Collection<JThequeError> errors) : Valide la vue. Pour invalider la vue, il suffit d'ajouter les erreurs dans la List. Si la vue ne nécessite aucune validation, vous pouvez simplement la laisser vide.

Par défaut, une vue :

  • Est modale
  • Est redimensionnable
  • Est caché lors de la fermeture (HIDE_ON_CLOSE)
  • Affiche l'icône de l'application
  • A son titre automatiquement mis à jour lors du changement de langue

Bien entendu, vous pouvez changer tout cela dans la méthode initView().

Voici les méthodes qui sont disponibles pour votre vue :
  • closeDown() ferme la vue
  • display() affiche la vue
  • toFirstPlan() remet la vue au premier plan
  • refresh() rafraîchit l'état des composants Swing
  • setTitleKey(String key, Object... replaces) modifie le titre de la fenêtre en utilisant la clé i18n et les objets de remplacement
  • getMessage(String key) permet de rechercher un texte internationalisé dans le contexte i18n.
  • setModel() et getModel() permettent de modifier et de récupérer le modèle de la vue
  • getManager() retourne le manager de la vue
  • getCloseAction(String key) permet de créer une action permet de fermer cette vue. Le paramètre key est la clé i18n pour le nom de l'action.
  • <T> T getBean(String name) retourne un bean du contexte Spring
  • getDefaultWindowIcon() permet de récupérer l'icône par défaut des fenêtres, il s'agit de l'icône configurée par l'application
  • startWait() et stopWait() permettent de démarrer une animation d'attente respectivement de la stopper

Voici un exemple de vue venant du module books :

/**
 * User interface to automatically add books.
 *
 * @author Baptiste Wicht
 */
public final class AutoView extends SwingBuildedDialogView<IAutoAddModel> implements IAutoView {
    private JTextField fieldTitle;
    private JList listLanguages;
    private JList listBooks;

    private DefaultListModel modelListBooks;

    /**
     * Construct a new JFrameAutoAdd.
     *
     * @param frame The parent frame.
     */
    public AutoView(Frame frame) {
        super(frame);

        build();
    }

    @Override
    protected void initView(){
        setModel(new AutoAddModel());
        setTitleKey("auto.view.title");
    }

    @Override
    protected void buildView(PanelBuilder builder){
        builder.addI18nLabel("auto.view.title.film", builder.gbcSet(0, 0));

        Action searchAction = new AcSearch();

        fieldTitle = builder.add(new JTextField(), builder.gbcSet(1, 0, GridBagUtils.HORIZONTAL, 2, 1));
        SwingUtils.addFieldValidateAction(fieldTitle, searchAction);

        listLanguages = new JList(new LanguagesListModel());
        listLanguages.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        builder.addScrolled(listLanguages, builder.gbcSet(0, 1, GridBagUtils.BOTH));

        builder.addButton(searchAction, builder.gbcSet(1, 1));

        modelListBooks = new DefaultListModel();

        listBooks = new JList(modelListBooks);
        listBooks.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        builder.addScrolled(listBooks, builder.gbcSet(2, 1, GridBagUtils.HORIZONTAL));

        builder.addButtonBar(builder.gbcSet(0, 2, GridBagUtils.HORIZONTAL),
                new AcValidateAutoAddView(), getCloseAction("generic.actions.cancel"));
    }

    @Override
    public JTextField getFieldTitle() {
        return fieldTitle;
    }

    @Override
    public DefaultListModel getModelListBooks() {
        return modelListBooks;
    }

    @Override
    public BookResult getSelectedBook() {
        return (BookResult) listBooks.getSelectedValue();
    }

    @Override
    public String getSelectedLanguage() {
        return (String) listLanguages.getSelectedValue();
    }

    @Override
    protected void validate(Collection<JThequeError> errors) {
        ValidationUtils.rejectIfEmpty(fieldTitle.getText(), "auto.view.title.film", errors);
        ValidationUtils.rejectIfNothingSelected(listLanguages, "auto.view.languages", errors);
    }
}