IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AWT/Swing Java Discussion :

Boutons , JMenus et interfaces... comment les associer?


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Par défaut Boutons , JMenus et interfaces... comment les associer?
    Je reprend la suite d'un sujet ou une reponse m'a mis sur la voix pour resoudre un de mes problemes.

    Citation Envoyé par bouye
    Tu peux aussi creer une Action, une interface qui etent ActionListener (voir AbstractAction, une classe qui implementes Action). Tu peux ajouter ton action en tant qu'ActionListener d'un bouton pre-existant mais surtout tu peux carrement creer de nouveaux boutons et menus a partir d'une seule et unique Action (voir les constructeurs des classes appropriees et JMenu.add() et JToolBar.add()). L'interet d'une action c'est qu'un changement de son etat (enabled/disabled, ...) est automatiquement reporte sur tous les boutons et menu crees avec.

    Pense au bouton .

    Salut à tous,

    Je me permet de reprendre ce topic afin de vous demander quelques eclaircissements car je ne comprend pas très bien comment utiliser ce systeme d'interfaces...

    J'ai exactement le type de probleme que tu décris, à savoir un JMenu et une barre d'outil ayant les memes fonctions sur un JTextPane et j'aimerais que quand j'active l'un, les valeurs booléennes de l'autre soitent mises à jour afin que cela reste cohérent.
    Par exemple, si je coche un check box de mon JMenu, que le bouton correspondant de ma barre d'outil soit enfoncé.


    Quand je lis ton message je comprend que me servir d'une interface me permettrais de la faire mais je ne comprend pas tres bien comment....

    Est-ce qu'il faut que je créais une interface comportant les actions communes de mes boutons et que je l'implemente?

    Merci d'avance pour votre aide car je bute sur ce probleme depuis un moment et j'enrage en vous voyant dire que c'est trivial

  2. #2
    Membre confirmé
    Avatar de osopardo
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Par défaut
    Un petit exemple devrait te permettre d'y voir plus clair :

    Code de l'action
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    public class ActionAnnuler extends AbstractAction {
     
            Controleur controleur;
     
    	public ActionAnnuler( Controleur controleur ) {
     
    		super( "Annuler", 
    			new ImageIcon( "icons" + File.separator + "annuler.gif" ) );
     
                    this.controleur = controleur;
     
    		putValue( Action.SHORT_DESCRIPTION, "Annuler" );
    		putValue( Action.MNEMONIC_KEY, KeyEvent.VK_A );
    		putValue( Action.ACCELERATOR_KEY, 
    			KeyStroke.getKeyStroke( KeyEvent.VK_Z,InputEvent.CTRL_MASK ) );
     
    		setEnabled( false );
    	}
     
    	public void actionPerformed(ActionEvent arg0) {
     
                    controleur.annuler();
    	}
    }
    Code pour la creation des elements de menu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    ActionAnnuler actionAnnuler = new ActionAnnuler( controleur);
    ...
    JMenuItem annuler = new JMenuItem( actionAnnuler );
    ...
    JToolBar toolBar = new JToolBar();
    toolBar.add( actionAnnuler );

  3. #3
    Membre éprouvé Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Par défaut
    Ouaaaa merciii c'est exectement ce que je comprennais pas !!

    Merci beaucoup


    Juste une petite précision, qu'est-ce que tu entend par "controleur"? Un listener? L'objet sur lequel on agit?


    Edit : hum après une bonne pause café j'ai compris
    Merci encore et vive les pauses café

  4. #4
    Membre confirmé
    Avatar de osopardo
    Inscrit en
    Juillet 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juillet 2005
    Messages : 92
    Par défaut
    Le controleur s'utilise dans le cadre du design pattern Modèle Vue Controleur. C'est une classe que tu creera de toute piece et qui decidera ce qui se passe quand l'utilisateur demande une annulation (pour rester dans mon exemple).
    Il pourra notament appeler actionAnnuler.setEnabled(false) s'il detecte qu'il n'y a plus rien a annuler (bien sûr tu doit avoir fait connaitre actionAnnuler à ce controleur).

    Par contre si tu n'a pas entendu parler du pattern MVC je te deconseille de commencer à l'utiliser au milieu d'un projet, c'est de loin le pattern le plus complexe car c'est une combinaison d'autres pattern et chacun y va de son implementation et interpretation personnelle.

    Les profs et cours que l'on peut trouver habituelement considèrent que le controleur est la classe qui implémente l'interface ActionListener, associée à un bouton ou autre.
    A mon avis c'est une grosse connerie, l'objectif du MVC étant de rendre indépendante les 3 parties Modèle Vue Controleur.
    Si le controleur implémente l'interface java.awt.ActionListener alors il devient intimement lié à aux interfaces graphiques basées sur awt.
    Si Swing utilise ActionListener je doute que ce soit le cas pour SWT et dans le cas d'une interface en ligne de commande on va être obliger de créer nous même un evenement qui puisse être detecter par une implémentation d'ActionListener
    Au lieu de vouloir à tout pris sortir la méthode actionPerformed des classes où l'on déclare les boutons, autant la laisser et y faire uniquement un appel à une méthode du controleur, ça sera bien plus propre (cela n'engage que moi, si d'autres on des arguments contraires, je suis preneur).

  5. #5
    Membre éprouvé Avatar de minus
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 153
    Par défaut
    Merci beaucoup pour toutes ces precisions cela va grandement m'etre utile

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 907
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 907
    Billets dans le blog
    54
    Par défaut
    Sinon, pour ton probleme particulier de menus et boutons a cocher c'est un peu plus complique dans Java 5.0 et versions anterieures ; en effet dans ces version une action n'a pas d'etat. Il te faudra 1) rajouter une propriete maison indiquant si l'action est selectionnee ou pas et 2) trouver un moyen de forwarder manuellement le changement d'etat de l'action a tous les boutons et menus crees avec. Pour ma part j'ai resolu le probleme en creant mes propres classes de toolbar, menu et tous les boutons qu'on preut creer a partir d'une action en surchargeant les methodes appropriees (note c'est une adaptation non-testee de mon code) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    ExtendedMenu extends JMenu {
      /** @inheritDoc
        */
      @Override public JMenuItem add(Action action) {
        JMenuItem result = new ExtendedMenuItem(action);
        add(result);
        return result;
      }
    }
     
    ExtendedToolBar extends JToolBar {
      /** @inheritDoc
        */
      @Override public JMenuItem add(Action action) {
        JButton result = new ExtendedButton(action);
        add(result);
        return result;
      }
    }
     
     
    ExtendedMenuItem extends JMenu {
      private extendedActionPropertyChangeListener = new new PropertyChangeListener() {
      /** @inheritDoc
       */
      public void propertyChange(PropertyChangeEvent event) {
        if (event.getPropertyName().equals(ExtendedAction.SELECTED_PROPERTY)) {
          Action action = (Action) event.getSource();
          Boolean selected = (Boolean)action.getValue(ExtendedAction.SELECTED_PROPERTY);
          super.setSelected(selected != null ? selected.booleanValue() : false);
        }
      };
     
       /** @inheritDoc
        */
       @Override public void setAction(Action a) {
         boolean oldAction = getAction();
         if (oldAction != null) {
           oldAction.removePropertyChangeListener(extendedActionPropertyChangeListener);
         }
         if (action != null) {
            action.addPropertyChangeListener(extendedActionPropertychangeListener);
         }
         super.setAction(a);
       }
     
       /** @inheritDoc
        */
      @Override public void configurePropertiesFromAction(final Action action) {
        super.configurePropertiesFromAction(action);
        Boolean selected = (Boolean)action.getValue(ExtendedAction.SELECTED_PROPERTY);
        super.setSelected(selected != null ? selected.booleanValue() : false);
       }
     
      /** @inheritDoc
        */
      @Override public void setSelected(boolean value) {
        action action = getAction();
        if (action != null) {
          // Will call super.setSelected().
          action.putValue(ExtendedAction.SELECTED_PROPERTY, value);
        }
        else {
           super.setSelected(value);
        }
      }
    }
    Note que le probleme a ete rectifie dans Java 6 par l'ajout de la propriete SELECTED_KEY

    Enfin comme tu l'aura remarque les methodes d'ajout d'une action a un menu ou une toolbar ne retourne que des boutons normaux. Donc pour faire des check box, radio et toggles il faudra faire plutot un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    Action action = ...;
    JRadioButtonMenuItem menuRadio1 = new JRadioButtonMenuItem(action);
    ...
    ButtonGroup menuGroup = new ButtonGroup();
    menuGoup.add(menuRadio1);
    ...
    menu.add(menuRadio1);
    ...
    JRadioButton buttonRadio1 = new JRadioButton(action);
    ...
    ButtonGroup buttonGroup = new ButtonGroup();
    buttonGroup.add(buttonRadio1 );
    ...
    toolbar.add(buttonRadio1);
    ...
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'affectation du TIME_DIALOG_ID à tous les boutons de l'interface
    Par khoukha1 dans le forum Composants graphiques
    Réponses: 1
    Dernier message: 03/07/2012, 13h00
  2. [C] Lister les interfaces et les IP associées ?
    Par brolon dans le forum Linux
    Réponses: 3
    Dernier message: 16/01/2008, 14h51
  3. [Sprite] Comment les afficher directement à l'écran
    Par fror dans le forum C++Builder
    Réponses: 3
    Dernier message: 05/03/2004, 16h20
  4. Position des balises H2 ou comment les numéroter
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 12/07/2003, 19h24
  5. Vous gerez comment les options d'un programme?
    Par n0n0 dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/05/2002, 13h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo