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

Composants Java Discussion :

[JMenuBar] Création d'objets à la volée


Sujet :

Composants Java

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 17
    Points
    17
    Par défaut [JMenuBar] Création d'objets à la volée
    Bonjour,

    Dans un programme, j'accède à une BDD, et je crée une barre de menu (JMenuBar) en fonction de deux tables. La table 'menu' pour les menus (JMenu) et la table 'menu_case' pour les sous_menus (jMenuItem)...

    J'ai une boucle qui ressemble à ça :

    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
     
    .
    .
    .
    while(res.next())
      {
      JMenu [b]Menu [/b]= new JMenu();
      Menu.setText(res.getString("colonne_menu"));
      String req2 = "REQUETE SQL";
      ResultSet res2 = requete2.executeQuery(req2);
      while(res2.next())
        {
        JMenuItem [b]MenuItem [/b]= new JMenuItem();
        etiquette = res2.getString("fra");
        MenuItem.setText(etiquette);
        Menu.add(MenuItem);
        }
      this.add(Menu);                
    }
    .
    .
    .
    Grâce à ça, j'ai bien mon menu hierarchisé. Cependant je ne pourrais pas (je pense) créer mes actions selon le MenuItem cliqué...

    L'astuce serait de pouvoir créer les objets JMenu et JMenuItem grâce à un nom de variable. En gros que mes noms de bouton Menu et MenuItem puisse être modifié selon ma ligne de résultat ds la requête. C'est à d'ire de pouvoir remplaçer mes noms d'objets par une chaine de caracère générer dans ma boucles.

    Merci d'avance pour les solutions que vous pourrez m'apporter.




    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  2. #2
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    et pourquoi ne pas créer un tableau pour les stocker ? tu les récupères après un par un et leur ajoutes les actions après coup ... n'est ce pas possible ?
    See you, space cowboy... and if you're satisfied, click on

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Hi, j'avais essayé hier et je n'y arrivais pas.
    C'est de ma faute, je m'y prenais mal. Effectivement, ça marche en utilisant la méthode int getRow sur le Resultset d'une requete.

    J'ai donc essayé de générer des actions, à l'éxécution, je génére l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    Je m'y prends de la façon suivante. J'ai une classe Barredemenu qui hérite de MenuBar. Je décris ces boutons et règle sa commande avec mes tables SQL.

    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
     
    public class BarreDeMenu  extends javax.swing.JMenuBar {
     
        JMenu[] Menua = new JMenu[10];
        JMenuItem[] MenuItema = new JMenuItem[30];
     
        /** Creates a new instance of BarreDeMenu */
        public BarreDeMenu() {
     
            String base = "jdbc:mysql://localhost:3306/table";
            String user = "login";
            String pass = "password";
            String req1 = "SELECT menu,fra FROM menu ORDER BY ordre";
     
            try{
                //Connection et requete
                while(res.next())
                {
                    Menua[res.getRow() - 1] = new JMenu();
                    String etiquette = res.getString("fra");
                    Menua[res.getRow() - 1].setText(etiquette);
                    String req2 = "REQUETE";
                    ResultSet res2 = requete2.executeQuery(req2);
                        while(res2.next())
                        {
                        MenuItema[res2.getRow() - 1] = new JMenuItem();
                        etiquette = res2.getString("fra");
                        MenuItema[res2.getRow() - 1].setText(etiquette);
                        [b]MenuItema[res2.getRow() - 1].setActionCommand[/b](res2.getString("menu_case"));
                        Menua[res.getRow() - 1].add(MenuItema[res2.getRow() - 1]);
                        }
     
                    this.add(Menua[res.getRow() - 1]);                
                }
                requete.close();
                requete2.close();
            }
            catch (SQLException s){
                System.out.println("SQL Error: " + s.toString() + " " + s.getErrorCode() + " " + s.getSQLState());
            }
            catch (Exception e){
                System.out.println("Error : " + e.toString() + e.getMessage());
            }
     
     
        }
    C'est la seule méthode de ma classe

    Sur ma classe Fenetre, j'implemente ActionListener.

    public class Fenetre extends JFrame implements ActionListener {

    BarreDeMenu bar = new BarreDeMenu();

    public Fenetre() {
    super("Titre de la fenetre");
    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

    // J'ajoute mes écouteurs sur ma table MenuItema ici

    for(int i=0;i<30;i++){
    if(bar.MenuItema[i]!=null){bar.MenuItema[i].addActionListener(this);}
    }


    setJMenuBar(bar);
    }

    public static void main(String args[]) {
    JFrame fenetre = new Fenetre();
    fenetre.pack();
    fenetre.setVisible(true);
    }

    // Enfin mes actions.

    public void actionPerformed(ActionEvent evt){
    String command = evt.getActionCommand();
    for (int j=0; j<30;j++){
    if (command == bar.MenuItema[j].getActionCommand()){
    System.out.println("Commande = " + bar.MenuItema[j].getText());
    }

    }
    }

    }
    L'architecture. Actioncommand ds ma classe BarreDeMenu et actionListener sur Fenetre est-elle correct ?

    Que signifie l'erreur que j'obtiens.

    A l'éxécution, j'arrive à générer "Commande = texte du bouton pour certains". Mes autres clicks ne sont pas pris en compte.

  4. #4
    Membre éclairé Avatar de BizuR
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    688
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 688
    Points : 757
    Points
    757
    Par défaut
    En regardant ton programme la premiere chose qui m'interpelle c'est plutot ... es-tu sur que lorsque tu executes ta seconde requete, la premiere a persisté ? il me semble que tout nouvelle execution efface les resultset precedent si on ne précise pas au statement que l'on veut plusieurs resultset en simultané ... as tu géré ce probleme ?

    Pour ton actioncommand ... tu peux tjs verifier si ton champ "menu_case" n'est pas null mais je ne sais pas si l'erreur vient de la ... peut etre devrais tu stocker ces champ qqpart ... pis les reutiliser dans la bonne classe (celle ou il y a l'action performed) mais encore une fois, je ne vois pas en quoi cela poserai probleme de le laisser ainsi ... a vrai dire, je n'ai jamais utiliser d'actioncommand :s
    See you, space cowboy... and if you're satisfied, click on

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    A propos des requetes, il semble que cela fonctionne correctement, puisque, ma barre de menu s'affiche correctement (selon ce que j'ai décidé dans ma table)...

    Je vais essayer de ne pas utiliser actioncommand, qui ne me sert à rien, vu que je ne fais jamais deux fois la meme action.

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Probleme Résolu

    1) Il fallait bien utiliser des tableaux de jMenu et jMenuItem. La méthode getRow() de la classe Resultset permet de se repérer dans le tableau.

    2) En passant par la detection d'objet, plutot que par la detection de la command (setactioncommand et getactioncommand).

    3) J'avais un probleme d'algorithmique pour le tableau MenuItema

    Merci BizuR, pour la pertinence de tes remarques qui m'ont permis d'avancer.

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

Discussions similaires

  1. [PowerBuilder] Création d'objets dynamiques
    Par Béné123456789 dans le forum Powerbuilder
    Réponses: 3
    Dernier message: 12/06/2006, 00h33
  2. [ImageMagick] Création d'image à la volée
    Par gdawirs dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 21/11/2005, 15h53
  3. Réponses: 11
    Dernier message: 16/10/2005, 20h21
  4. [FLASH MX2004] Création d'objet dynamiquement
    Par noarno dans le forum Flash
    Réponses: 3
    Dernier message: 15/12/2004, 11h00
  5. [IB][IBQUERY][D7 pro] Création de Triggers à la volée.
    Par N1bus dans le forum Bases de données
    Réponses: 6
    Dernier message: 13/10/2004, 14h23

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