PROGRAMMATION SWING ET XML

III. LA NOTION D'ACTION ET LES COMPOSANTS TEXTUELS.

1. Comment utiliser les actions

Si vous avez deux composants ou plus qui ont la meme fonctionnalité, considérez l'utilisation des objets Action pour implémenter cette fonction. Un objet Action est un ActionListener qui fournit non seulement la gestion d'événement, mais aussi une gestion centralisée du texte, de l'icone et de l'état d'un bouton de barre d'outils ou d'un item dans un menu. En ajoutant une Action à une JToolBar, JMenu, ou un JPopupMenu, vous obtenez les fonctionnalités suivantes :
  • Un nouveau JButton (pour la JToolBar) ou JMenuItem (pour le JMenu ou le JPopupMenu) qui est automatiquement ajouté à la barre d'outils ou au menu. Le bouton ou le menu item utilisent en plus automatiquement l'icone et le texte spécifié par l'Action.
  • Un action listener est enregistré (l'objet Action) auprès du bouton ou du menu item.
  • Une gestion centralisé de l'état d'accessibilité du bouton ou du menu item.
  • Voici un exemple d'utilisation d'une Action pour créer un bouton dans une barre d'outils et un menu item qui effectuent la meme fonction :
     
     
    Action leftAction = new <une classe implementémentant une Action>(...);
    JButton button = toolBar.add(leftAction);
    JMenuItem menuItem = mainMenu.add(leftAction);

    Pour un bouton ou un menu, pour tirer parti de l'utilisation d'une Action, vous devez créer le composant en utilisant la méthode add(Action) des classe JToolBar, JMenu, ou JPopupMenu. Actuellement, on ne dispose pas d'autre API que addActionListener(ActionListener) pour connecter une Action à un composant qui existe déjà. Par exemple, bien que vous puissiez ajouter un objet Action en tant qu'action listener à n'impote quel bouton, le bouton ne sera pas notifié lorsque l'action sera rendue non-accessible.

    Pour créer un objet Action, on crée généralement une sous-classe de la classe AbstractAction et de l'instancier ensuite. DAns la sous-classe, vous devez implémenter la méthode actionPerformed pour réagir de manière approprié lorsque des événements ont lieu. Voici un exemple de création et d'instanciation d'une sous-classe de la classe AbstractAction :
     

     
    leftAction = new AbstractAction("Go left",
                                    new ImageIcon("images/left.gif")) {
        public void actionPerformed(ActionEvent e) {
            displayResult("Action for first button/menu item", e);
        }
    };

    Voici une image de l'application qui utilisent les actions pour implémenter trois fonctionnalités :

    A snapshot of ActionDemo, which uses actions to coordinate menus and buttons.

    Essayez ceci :
    1. Compilez et exécutez l'application. The source file is ActionDemo.java. Vous aurez besoin aussi des trois images suivantes.
    2. Sélectionnez le premier item du menu à gauche (Menu > Go left).

    3. Le text area affiche les informations identifiants à la fois la source de l'événement et l'action listener qui a recu l'événement.
    4. Appuyez maintenant sur le bouton le plus à droite de la barre d'outils.

    5. Le text area affiche de nouveau les informations relatives à l'événement. Remarquez que bien que la source de l'événement soit différente, les deux événements ont été traités par le meme action listener: l'objet Action avec lequel les composants ont été créés.
    6. Sélectionnez maintenant le premier item du menu Action State.

    7. Ceci provoque la non accessibilité de l'objet  Action  "Go left", qui à son tour va rendre non accessible les composants auquel il est associé (le bouton et le menu).

    Voici ce que voit l'utilisateur lorsque que l'action "Go left" est non accessible :
    A snapshot of ActionDemo when
    Voici le code permettant de rendre non accessible l'action "Go left" :
     
     
    boolean selected = ...//true, si l'action doit etre accessible;
                          //false, sinon
    leftAction.setEnabled(selected);

    Après avoir crée les composants en utilisant une Action, vous aurez probablement besoin de les adapter. Par exemple, vous voudriez bien régler la bulle d'aide associée au bouton. Ou bien, vous aimeriez bien modifier l'apparence d'un des composants en rajoutant ou enlevant l'icone ou le texte. Par exemple, ActionDemo.java ne possède pas d'icones dans ses menus, ni de texte dans ses boutons, ni de bulles d'aide pour ses boutons. Voici le code qui s'accomplit de cette tache :

     
     
    button = toolBar.add(leftAction);
    button.setText(""); //un bouton avec seulement une icone
    button.setToolTipText("This is the left button");
    menuItem = mainMenu.add(leftAction);
    menuItem.setIcon(null); //on ne veut pas d'icone dans le menu

    L'API Action

    Les tableaux suivants listent les constructeurs et méthodes les plus utilisées de la classe Action . L'API pour utiliser les objets Action tombent dans deux catégories :
  • Créer et utiliser une Action
  • Créer un composant controllé par une Action

  •  
    Créer et utiliser une Action
    Constructor or Method Purpose
    AbstractAction() 
    AbstractAction(String) 
    AbstractAction(String, Icon)
    Crée un objet Action. En fonction des arguments, vous pouvez spécifier le texte et l'icone à utiliser dans le componsant que l'action controllera.
    void setEnabled(boolean) 
    boolean isEnabled()
    Fixe ou récupère si le composant controllé par l'action sont accessibles ou non. Invoquer la méthode setEnabled(false) rend non accessible tous les composants que l'action controle. De manièrte identique, invoquer la méthode setEnabled(true) rend accessible tous les composants controllés par l'action.
    Créer un composant controllé par une Action
    Method Purpose
    JMenuItem add(Action) 
    JMenuItem insert(Action, int)
    (in JMenu and JPopupMenu)
    Crée un objet JMenuItem et le rajoute au menu ou à un popup menu. 
    JButton add(Action)
    (in JToolBar)
    Crée un objet JButton et l'ajoute à la tool bar